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

Fra*_*ein 3 c# referential-integrity entity-framework 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获取标识值并设置属性).

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

异常消息:

发生了引用完整性约束违规:关系一端的"VisitId"的属性值与另一端的"VisitPage.VisitId"的属性值不匹配.

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

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

Yul*_*dra 6

要么这样做

visitPage.VisitId = VisitPage.Visit.Id;
visitPage.Visit = null;
Run Code Online (Sandbox Code Playgroud)

要么

context.Visits.Attach(visitPage.Visit);
Run Code Online (Sandbox Code Playgroud)

要么

context.Entry(visitPage.Visit).State = EntityState.Unchanged;
Run Code Online (Sandbox Code Playgroud)