两个多对一表关系和实体框架插入

时间:2013-07-25 15:35:42

标签: c# entity-framework-4

我有一个类似的模型:

enter image description here

上下文:这个想法是它是一个样本数据库。一个样本具有详细信息,并且可以将多个样本一起整理到Collat​​edSample中,并且可以在Collat​​edDetail中将细节整理在一起。因此,一个Collat​​edSample有许多Collat​​edDetails,并从许多样本开始,每个样本都有许多细节。 Collat​​edDetail也有很多细节。这是一个“漂亮”的广场。

我添加记录的方法是:

var sample = new Sample();
var detail = new Detail();
sample.Details.Add(detail);
// suppose I add a bit more meat to these entities...

var collatedSample = new CollatedSample();
var collatedDetail = new CollatedDetail();
collatedSample.Samples.Add(sample);
collatedSample.CollatedDetails.Add(collatedDetail);
collatedDetail.Details.Add(detail);

context.CollatedSamples.AddObject(collatedSample);
context.SaveChanges();

所以我已经将所有元素添加到彼此,并将Detail添加到Sample和Collat​​edDetail。在SaveChanges上,我收到一条更新异常,其中包含一条快照消息:

无法确定'SamplingModel.FK_Detail_Collat​​edDetailId'关系的主要结尾。多个添加的实体可以具有相同的主键。

我认为可能真正发生的是尝试在记录Collat​​edDetail之前记录Detail实体。具有两个关系的Detail表是导致问题的那个(不将它们添加到Sample或Collat​​edDetail确认它)。 也许有一种方法可以指定插入的顺序?我也尝试了相反的方法来设置父级而不是在子集合上使用.Add(),结果相同。否则,如何一次性进行这种双管齐下的插入?

编辑:tl;博士:

enter image description here

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方法:我删除了Detail和Collat​​edDetail之间的外键,如建议的@JaderDiag,以及Collat​​edDetail表中的引用字段。实体框架创建了部分类,因此很容易为两个实体创建其他部分类并手动连接它们。我怀疑这会慢得多,但它在后来的开发中提供了与实体提供的外键相同的流动性。

这是一种解决方法,绝对不是我想要的解决方案。如果可以的话,会投票支持。