2011-03-17 81 views
0

我無法讓Entity Framework 4處理m2m連接中的批量更新。我有幾個多對多連接在我的模型,例如像EF如何更新多對多連接表

實踐
PracticeID PK
名稱...

PracticeSpecialties(連接表)
PracticeID PK
SpecialtyID PK

專業
SpecialtyID pk
名稱...

非常基本,EF 4可以很好地處理它。我的問題是我需要能夠將2個或更多專業「合併」爲1,例如「兒科」和「兒童」和「青少年」應該都是相同的項目。因此,如果兒科的SpecialtyID爲1,兒童= 3,青少年= 9,則查詢應在專業ID IN(3,9)的PracticeSpecialties中執行所有行的更新並將值更改爲1.

我可以寫一個存儲過程會更新做連接表中的所有行,包含不想要的SpecialtyID之一,然後刪除所有現在孤立的特色,但如果可能,我試圖堅持EF模式。

任何指導表示讚賞。

回答

2

在實體框架中,您必須以對象的方式來執行=您可以簡單地修改聯結表。您必須使用導航屬性中的對象。你的情況會是這樣的:

var children = context.Specialities.Include("Practices") 
         .Single(s => s.Name == "Children"); 
var pediatrics = context.Specialities.Include("Practices") 
         .Single(s => s.Name == "Pediatrics"); 

foreach (var practice in children.Practices) 
{ 
    pediatrics.Practices.Add(practice); 
} 

children.Practices.Clear(); 
context.Specialities.DeleteObject(children); 
context.SaveChanges(); 

你也應該在Practice實體覆蓋EqualsGetHashCode和使用HashSetSpeciality.Practices(在波蘇斯的情況下)。它會爲你處理複雜性。

這樣做的結果將是多次刪除並插入到聯結表中。這是EF方式來做到這一點。

+1

切換到NHibernate – 2011-03-17 23:10:59

+3

@adymitruk:你應該解釋它,如果你想發佈這樣的評論。 – 2011-03-17 23:13:55

+0

這是一件美麗的事情,非常好。並且還要感謝關於覆蓋Equals和GetHashCode的提示,我將添加這些內容。很好的答案,謝謝! – StuTheDog 2011-03-17 23:20:46

0

請勿使用多對多關係。無論如何,連接表最終會保存更多的數據。改爲使用一對多和多對一的組合。如果你願意,你現在可以創建一個在中間實體中保存創建/修改日期的屬性。

希望這會有所幫助。