实体框架断开了图形和导航属性

时间:2014-07-29 23:28:33

标签: c# entity-framework referential-integrity disconnected-session

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

访问:ID(身份),UrlReferrer,Pages。 VisitPage :ID(身份),姓名,访问,VisitId

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

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

异常消息:

发生了参照完整性约束违规:' VisitId'的属性值。在一段关系的一端与' VisitPage.VisitId'的财产价值不匹配。在另一端。

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

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

1 个答案:

答案 0 :(得分:6)

要么这样做

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

context.Visits.Attach(visitPage.Visit);

context.Entry(visitPage.Visit).State = EntityState.Unchanged;