0

我有一个类似的模型:

在此处输入图像描述

背景:这个想法是它是一个样本数据库。一个样本有细节,几个样本可以一起整理成一个Collat​​edSample,细节也可以一起整理到一个Collat​​edDetail中。所以,一个 Collat​​edSample 有很多 Collat​​edDetails,从很多 Samples 开始,每个 Samples 都有很多 Details。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();

因此,我将所有元素相互添加,并将详细信息添加到 Sample 和 Collat​​edDetail。在 SaveChanges 上,我收到一条带有快乐消息的更新异常:

无法确定“SamplingModel.FK_Detail_Collat​​edDetailId”关系的主体端。多个添加的实体可能具有相同的主键。

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

编辑:tl;博士:

在此处输入图像描述

4

1 回答 1

1

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

这是一种解决方法,绝对不是我正在寻找的解决方案。如果可以的话,我会投反对票。

于 2013-07-26T14:22:18.687 回答