2016-06-17 145 views
1

因此,我最終將自己的頭圍繞自我引用EF代碼中的多對多關係首先我想,但現在我可以進入關於最佳方式更新這些關係。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有什麼關係。

是否有一種乾淨的方式來通過從multiselect中選擇的新項目,將其與thisContact.Friends中已有的項目進行比較,添加新項目,刪除那些不存在並保留匹配的項目?

我希望這是有道理的,謝謝你提前!

+0

只是取代朋友是迄今爲止最簡單的方法。這並不昂貴,因爲只涉及非常小的記錄(除非有數百個項目)。 –

+0

你的意思是刪除存在的朋友,然後添加新的朋友? – blubberbo

+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 

的「除」的方法是唯一的好,如果你正在傳遞完整的對象。 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); 

然後只是遍歷列表並根據需要添加/刪除它們。

+0

感謝您的信息!我想我會留在刪除,然後再次添加它們,因爲我不認爲這會對系統造成太大的稅收 – blubberbo

+0

有了上述內容,只需刪除那些需要刪除的內容並添加新內容即可。不改變的聯繫人不需要做任何事情。 – user1455010

+0

我很抱歉,但我不確定你的最後一句話是什麼「然後只是遍歷你的列表並根據需要添加/刪除它們。」會看你創建的變量。你介意給我寫信嗎? – blubberbo