2011-08-25 144 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