Linq To Sql ManyToMany更新现有记录

时间:2011-01-10 20:30:02

标签: c# linq linq-to-sql many-to-many

我有两个实体之间的多对多关系。 UserInfo和Campaign以及第三个表UserInfoCampaigns

在前端,用户应该可以使用多个复选框更新用户广告系列。

所以我有:

var selectedCampaignsIds = new int[] {1,2,3}

var user = _extendedUserService.GetUser(new Guid(userId));

var newCampaigns =_campaignrepository.GetAllCampaignsByIds(selectedCampaignsIds);

我可以通过以下方式分配新选择的广告系列:

foreach (var campaign in newCampaigns)
{
    var userInfoCampaign = new UserInfoCampaign { UserInfoId = user.Id, CampaignId = campaign.Id };
    _campaignrepository.SaveUserInfoCampaign(userInfoCampaign);
}

我的问题是如何考虑用户可能有或可能没有现有广告系列来更新UserInfo广告系列?

我是否删除所有现有的UserInfoCampaigns然后重新分配新的UserInfoCampaigns?或者有一种更优化的方式来更新UserInfo活动而不首先使用LINQ to SQL删除它们?

非常感谢。

3 个答案:

答案 0 :(得分:1)

通常,您将删除它们并重新创建它们。这就是我处理这种情况的方式。

答案 1 :(得分:0)

如果你去了(全部删除)解决方案,那么你可能会认为你的表中的id会以无连续形式增加(我假设你的PK是一个int),如果你不关心那么删除它们然后重新添加

如果您希望身份处于续订状态,您可以在广告系列表格中设置一个标记(IsDeleted),将广告系列视为已删除,您可以在用户删除广告系列时将其设置为ture,并在用户设置为false从UI中重新选择它可以确保更少的记录,但在代码中需要更多的工作

答案 2 :(得分:0)

通常,我们只是让SQL处理它。您可以在SQL中为关系指定ON DELETE,可以CASCADESET DEFAULTSET NULL,具体取决于您想要的行为。

以下是ON DELETE CASCADE的示例: http://www.codeproject.com/KB/cs/CascadingDeletes_cs.aspx