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

2024-03-03

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

Visit:Id(身份)、UrlReferrer、页面。访问页面:ID(身份)、姓名、访问、访问 ID

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

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

异常消息:

发生参照完整性约束违规:关系一端的“VisitId”属性值与另一端的“VisitPage.VisitId”属性值不匹配。

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

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


要么这样做

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

or

context.Visits.Attach(visitPage.Visit);

or

context.Entry(visitPage.Visit).State = EntityState.Unchanged;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐