2011-08-25 139 views
2

好的。所以這裏是交易。我有兩個實體 - 「產品」和「零件」。該產品由部件組成。而且零件可以在其他產品中重複使用。這些實體之間的關係是多對多的。這一切都很好。實體框架 - 在多對多關係中添加兩次相同的實體

問題是,我不能將同一產品添加到同一產品兩次。 EF似乎強制所有相關實體都是唯一的。考慮下面的代碼:

var product = context.Create<Product>(); 
var part = GetSomePart(); 

Console.WriteLine(product.Parts.Count); // will output 0 

// Add a part 
product.Parts.Add(part); 
Console.WriteLine(product.Parts.Count); // will output 1 

// Add the same part again 
product.Parts.Add(part); 
Console.WriteLine(product.Parts.Count); // will output 1! 

所以好吧,我明白了 - 避免重複或其他。但我需要這是可能的。有沒有辦法做到這一點(告訴EF停止強制執行唯一值)而不創建額外的表?或者解決這個問題的唯一方法是手動添加中間表並處理多對多的自己?

回答

2

在這種情況下,您將不得不創建另一個名爲「ProductParts」的表,該表具有標識唯一鍵,並且可以保存對產品和零件的引用,它們也可以是多個。

+0

是的,我想我必須走這條路,除非別人來了一個原生EF解決方案(我懷疑)。 – Jefim

+0

這是唯一可能的方式,因爲在很多情況下,您的兩把鑰匙都會形成唯一的鑰匙,並且無論如何您都無法將其添加到數據庫中。您的組合在許多情況下都是獨一無二的,只有ID是主鍵。 –

+0

Jep,我只是想,如果我能告訴EF添加這個代理鍵本身。但我想這是不可能的。感謝您的解釋 - 標記答案已被接受。 – Jefim

0

在第二個添加語句中,它不會添加另一個對象,因爲part已處於添加狀態。所以你需要創建一個具有相同屬性的新對象再次添加它。

product.Parts.Add(new Part{someProperty=part.someProperty ... ect }); 

如果你想減少代碼,你可以使用Automapper(http://automapper.codeplex.com/)來複制所有屬性,

product.Parts.Add(Mapper.Map<Part,Part>(part)); 
+0

重點是添加兩次相同的參考。添加一個複製的對象不一樣。但是,無論如何感謝:) – Jefim