所以我终于开始围绕自我引用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
中已有的项目进行比较,添加新项目,删除不存在的项目并保留匹配的项目?
我希望这是有道理的,谢谢你提前!
答案 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);
然后只需遍历您的列表并根据需要添加/删除它们。