C# 实体框架图和导航属性

C# 实体框架图和导航属性,c#,entity-framework,referential-integrity,disconnected-session,C#,Entity Framework,Referential Integrity,Disconnected Session,我正在使用EntityFramework6代码优先和FluentAPI。我在访问和VisitPage之间有一对多关系(一次访问有多个VisitPage对象)。这是POCO类的简化版本: 访问:Id(身份)、URLreferer、页面。 访问页面:Id(身份),姓名,访问,访问Id 首先,我创建一个Visit对象,并向其中添加一个VisitPage对象。然后,我将它们插入数据库。在这一点之前,一切正常。观察:VisitPage中的VisitId属性在插入后自动设置(它从DB中获取标识值并设置属性)

我正在使用EntityFramework6代码优先和FluentAPI。我在访问和VisitPage之间有一对多关系(一次访问有多个VisitPage对象)。这是POCO类的简化版本:

访问:Id(身份)、URLreferer、页面。 访问页面:Id(身份),姓名,访问,访问Id

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

然后,在断开连接的环境中,我向访问添加一个新页面(我不从DB获取访问对象,这就是我所说的断开连接的环境)。这个新页面引用了相同的访问对象,但我没有设置VisitId属性,因为我认为EF应该基于visit属性设置它。这就是问题所在,EF没有设置它,事实上,它抛出了一个异常,表示Visit属性和VisitId属性的值不匹配。我原以为EF能够在幕后完成这项工作(例如在DetectChanges方法中),但事实并非如此

异常消息:

发生引用完整性约束冲突:关系一端的“VisitId”属性值与另一端的“VisitPage.VisitId”属性值不匹配

那么,我该如何解决这个问题呢?我认为有两种可能的解决办法: 1) 在连接的环境中工作-->从EF获取访问对象,然后添加页面对象。在这种情况下,EF会更新VisitId值,它会正常工作。 2) 设置访问对象后手动设置VisitId

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

或者这样做

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


对不起,也许我遗漏了什么。第一个选项:为什么要将visitPage.Visit设置为空?如果我要明确(我不想要的东西),我会设置visitPage.VisitId=visitPage.Visit.Id,因为我已经设置了visitPage.Visit=Visit;关于第二个选项,“附加”会将状态设置为“未更改”,就像您建议的第三个选项一样。调用SaveChanged后,不会向数据库发送任何内容(无更新)。你可以查一下。感谢您的回答,但我希望有更好的解决方案。@FranciscoGoldenstein,
visitPage
处于添加状态,除非您手动附加或更新状态,否则同步将无法工作,否则您需要使用外键值,在本例中,
VisitId
,请查看
注意:如果引用处于添加状态(在本例中为课程对象),参考导航属性将不同步…
context.Visits.Attach(visitPage.Visit);
context.Entry(visitPage.Visit).State = EntityState.Unchanged;