3

我正在使用 Entity Framework 6 Code First 和 Fluent API。我在 Visit 和 VisitPage 之间有一对多的关系(1 Visit 有很多 VisitPage 对象)。这是 POCO 类的简化版本:

访问:Id(身份)、UrlReferrer、页面。 VisitPage : Id (身份), Name, Visit, VisitId

首先,我创建一个 Visit 对象并向其添加一个 VisitPage 对象。然后,我将它们插入数据库。到此为止,一切正常。观察: VisitPage 中的 VisitId 属性在插入后自动设置(它从 DB 中获取标识值并设置属性)。

然后,在断开连接的环境中,我为访问添加了一个新页面(我没有从数据库中获取访问对象,这就是我所说的断开连接环境的意思)。这个新页面引用了同一个访问对象,但我没有设置 VisitId 属性,因为我认为 EF 应该根据 Visit 属性设置它。这就是问题所在,EF 没有设置它,事实上,它抛出了一个异常,说 Visit 属性和 VisitId 属性的值不匹配。我期待 EF 能够在后台执行此操作(例如在 DetectChanges 方法中),但事实并非如此。

异常消息:

发生参照完整性约束违规:关系一端的“VisitId”的属性值与另一端的“VisitPage.VisitId”的属性值不匹配。

那么,我该如何解决呢?我看到了两种可能的解决方案: 1) 在连接的环境中工作 --> 从 EF 获取访问对象,然后添加页面对象。在这种情况下,EF 更新 VisitId 值并且它可以工作。2)设置Visit对象后手动设置VisitId。

我希望我已经足够清楚了。如果没有,请告诉我。

4

1 回答 1

6

要么这样做

visitPage.VisitId = VisitPage.Visit.Id;
visitPage.Visit = null;

或者

context.Visits.Attach(visitPage.Visit);

或者

context.Entry(visitPage.Visit).State = EntityState.Unchanged;
于 2014-07-30T02:50:14.783 回答