我只是将应用程序升级到EF6。
我的基础对象Trip包含Reservations。我传递给AddObject和Add函数的我的预订对象只有Trip_Id字段集我没有将Trip导航属性设置为Trip对象。话虽如此,在调用db.SaveChanges之后的EF4中,预留对象DOES可以访问导航属性“Trip”。然而,在EF6中,这不会发生。有什么想法吗?
EF 6代码
db.Reservations.Add(reservation);
db.SaveChanges();
return RedirectToAction("Details", "Trip", new { id = reservation.Trip.Id });
EF4代码
db.Reservations.AddObject(reservation);
db.SaveChanges();
return RedirectToAction("Details", "Trip", new { id = reservation.Trip.Id });
似乎EF6没有AddObject,我需要使用Add功能。
答案 0 :(得分:0)
您刚刚创建了reservation
对象,还是从数据库加载了它?
如果您刚刚创建它,则会引用实际对象,而不是EF将生成的代理。
在这种情况下,我认为这可能适用(尽管最后,它说DbSet.Add()
应该自动调用DetectChanges()
,而你的db.Reservations属性可能是DbSet
打字......嗯......)。
您可能因某种原因关闭了更改跟踪?出于性能原因,可能会这样做。
来自http://msdn.microsoft.com/en-us/data/jj713564.aspx
同步FK和导航属性之间的更改
当您更改附加到的对象的关系时 上下文通过使用上述方法之一,实体 框架需要保留外键,引用和集合 同步。实体框架自动管理此同步 POCO实体的(也称为关系修复) 代理。有关更多信息,请参阅使用代理。
如果您使用没有代理的POCO实体,则必须确保 调用DetectChanges方法来同步相关的 上下文中的对象。请注意,以下API自动生成 触发DetectChanges调用。
DbSet.Add DbSet.Find DbSet.Remove DbSet.Local DbContext.SaveChanges DbSet.Attach DbContext.GetValidationErrors DbContext.Entry DbChangeTracker.Entries对DbSet执行LINQ查询