实体框架断开连接的图形和导航属性

本文关键字:导航 属性 图形 框架 断开 连接 实体 | 更新日期: 2023-09-27 18:15:45

我正在使用实体框架6代码第一和流畅的API。我在Visit和VisitPage之间有一对多的关系(1 Visit有许多VisitPage对象)。这是POCO类的简化版本:

Visit: Id (identity), UrlReferrer, Pages。 VisitPage : Id(身份)的名字,访问,VisitId

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

然后,在一个断开连接的环境中,我向访问添加一个新页面(我没有从DB获得visit对象,这就是我所说的断开连接的环境)。这个新页面引用了相同的访问对象,但我没有设置visiid属性,因为我认为EF应该根据访问属性设置它。这就是问题所在,EF没有设置它,实际上,它抛出一个异常说Visit property和visiid property的值不匹配。我期望EF能够在引子下做到这一点(例如在DetectChanges方法中),但它没有。

异常消息:

引用完整性约束发生冲突:关系一端的'VisitId'的属性值与'VisitPage '的属性值不匹配。在另一端的visiid

怎么解呢?我认为有两种可能的解决方案:1)在连接的环境中工作->从EF获取Visit对象,然后添加page对象。在这种情况下,EF更新visiid值,它工作。2)设置Visit对象后,手动设置VisitId

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

实体框架断开连接的图形和导航属性

要么这样做

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

context.Visits.Attach(visitPage.Visit);

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