EF代码优先自引用多对多更新引用

时间:2016-06-17 14:42:14

标签: c# asp.net-mvc entity-framework ef-code-first

所以我终于开始围绕自我引用EF代码中的许多关系,但我现在可以提出更新这些关系的最佳方法。

让我们说我们有这种关系:

   modelBuilder.Entity<Contact>()
                    .HasMany(c => c.Friends)
                    .WithMany()

Contact.cs类中包含以下内容:

public virtual iCollection<Contact> Friends {get;set;};

在我的联系人视图中,我有一个多选来为联系人选择朋友。然后我通过迭代所有选定的并运行thisContact.Friends.Add(friend)并保存更改来保存。

然后,当你回到联系人视图时,它很容易检索.Friends并重新填充多选,但我一直遇到重新保存新朋友的问题。最好的方法是什么?我首先考虑删除所有的朋友,然后从多选中添加新的朋友,但这看起来效率不高,我不确定在什么时候删除与保存相关的.Friends Contact

是否有一种干净的方式来浏览从多选中选择的新项目,将其与thisContact.Friends中已有的项目进行比较,添加新项目,删除不存在的项目并保留匹配的项目?

我希望这是有道理的,谢谢你提前!

1 个答案:

答案 0 :(得分:1)

假设您拥有自己的域名集(contact.Friends),并从UI(uiFriends)返回您的朋友集合。

首先你找到被删除的朋友(伪代码)

var removeTheseFriends = contact.Friends.Except(uiFriends);  // Returns friends that are only in your domain collection
var addTheseFriends = uiFriends.Except(contact.Friends);  // Returns friends only in your UI collection

&#34;&#34;&#34;方法只有在传递完整对象时才有用。 https://msdn.microsoft.com/en-us/library/bb300779(v=vs.90).aspx

实际上,UI集合可能是Friends集合中联系人ID的列表。在这种情况下,您可以执行以下操作:

var removeTheseFriends = contact.Friends.Where(i => !uiFriends.Contains(i.Id));

// First load the list of friends that correspond to your ui collection Ids
var domainObjectsOfUiFriendsCollection = context.Contacts.Where(i => uiFriends.Contains(i.Id));

// These are now domain objects, so you can now use the Except functionality
var addTheseFriends = domainObjectsOfUiFriendsCollection.Except(contact.Friends);

然后只需遍历您的列表并根据需要添加/删除它们。