我正在使用实体框架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;