代码之家  ›  专栏  ›  技术社区  ›  Francisco Goldenstein

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

  •  3
  • Francisco Goldenstein  · 技术社区  · 10 年前

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

    参观 :Id(标识),UrlReferrer,Pages。 访问页面 :Id(身份),名称, 访问,访问ID

    首先,我创建一个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。

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

    1 回复  |  直到 10 年前
        1
  •  6
  •   Yuliam Chandra    10 年前

    要么这样做

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

    context.Visits.Attach(visitPage.Visit);
    

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