代码之家  ›  专栏  ›  技术社区  ›  FBryant87

EntityFramework在保存时为FK关系置零

  •  0
  • FBryant87  · 技术社区  · 7 年前

    在EF6中,我从DB加载我的机场:

    var existingAirport = db.Airports.SingleOrDefault(a => a.ID == airportID)
    //airport is loaded, it has a countryID and virtual Country object
    

    我执行一些逻辑,进行一些修改以改变关系,同时更改国家对象和FK ID:

    //it's a bit more complex, but simplified:
    existingAirport.Country = //the someOtherCountryObject
    existingAirport.CountyID = //the someOtherCountryObject.ID
    

    我保存更改(应将机场指定为新国家)

    db.SaveChanges();
    

    问题是EF决定将数据库和内存中的关系置零(existingAirport.Country和existingAirport.CountyID现在都为null)。机场现在与 也不 新的或旧的国家。

    有人能想出EF这样做的原因吗?新的FK指向一个有效的国家。

    2 回复  |  直到 7 年前
        1
  •  2
  •   jbl    7 年前

    看起来您正在尝试添加一个新国家,但我没有看到您的新国家实体被添加到上下文中。

    请参考这些帖子了解更多信息。 Updating child objects in Entity Framework 6 Entity Framework 6: Adding child object to parent's list vs. setting child's navigation property to parent

        2
  •  0
  •   FBryant87    7 年前

    这花了我一段时间,但这是由模型其他部分中的循环引用引起的。例如,我有一个国家列表,其中有一个国家对象( 其他国家对象 在这种情况下)具有EF生成的对机场的引用。

    在映射阶段,即将国家映射到DB时,我忽略了这些参考,从而解决了这个问题:

    .ForMember(c => c.AppName_Airport, opt => opt.Ignore())
    

    这解决了问题,防止了在调用SaveChanges()时EF使关系为null。我的机场现在拥有了它应该拥有的国家,没有出现重复或任何副作用。