我有一个类似的模型:
上下文:这个想法是它是一个样本数据库。一个样本具有详细信息,并且可以将多个样本一起整理到CollatedSample中,并且可以在CollatedDetail中将细节整理在一起。因此,一个CollatedSample有许多CollatedDetails,并从许多样本开始,每个样本都有许多细节。 CollatedDetail也有很多细节。这是一个“漂亮”的广场。
我添加记录的方法是:
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和CollatedDetail。在SaveChanges上,我收到一条更新异常,其中包含一条快照消息:
无法确定'SamplingModel.FK_Detail_CollatedDetailId'关系的主要结尾。多个添加的实体可以具有相同的主键。
我认为可能真正发生的是尝试在记录CollatedDetail之前记录Detail实体。具有两个关系的Detail表是导致问题的那个(不将它们添加到Sample或CollatedDetail确认它)。 也许有一种方法可以指定插入的顺序?我也尝试了相反的方法来设置父级而不是在子集合上使用.Add()
,结果相同。否则,如何一次性进行这种双管齐下的插入?
编辑:tl;博士:
答案 0 :(得分:1)
我找到了一个解决方法:我删除了Detail和CollatedDetail之间的外键,如建议的@JaderDiag,以及CollatedDetail表中的引用字段。实体框架创建了部分类,因此很容易为两个实体创建其他部分类并手动连接它们。我怀疑这会慢得多,但它在后来的开发中提供了与实体提供的外键相同的流动性。
这是一种解决方法,绝对不是我想要的解决方案。如果可以的话,会投票支持。