我正在使用带有 DbContext 的 Database First 从 Linq-to-SQL 迁移到 Entity Framework (4.4)。我想知道以下行为是否正常:
using (var e = new AgendaEntities()) {
var store = e.Stores.First();
var office = e.Offices.Create();
office.Store = store; // Set association
Console.WriteLine(office.StoreID); // shows Guid.Empty, expected store.ID!
}
在 L2S 中,设置与Store
实体的关联也会更新StoreID
密钥。在 EF 中,这似乎没有发生。这与实体是新的还是从上下文加载的无关。
当 I 时SaveChanges
,它会正确保存并StoreID
更新为 match office.ID
,但为什么这只会在保存后发生?
有什么我遗漏的,还是我现在应该手动保持外键同步?
解决方案编辑:
这称为属性修复,过去由生成的代理自动完成。但是,DbContext
情况不再如此。根据这个 Connect issue,这是设计使然。
您好,DbContext 模板实际上不会生成将用作更改跟踪代理的类 - 只是延迟加载代理(不进行修复)。我们做出这个决定是因为变更跟踪代理很复杂,并且有很多细微差别,可能会让开发人员感到非常困惑。如果您希望在 SaveChanges 之前进行修复,您可以调用 myContext.ChangeTracker.DetectChanges。~EF 团队
另一种方法是调用DbContext.Entry(entity)
,它将同步实体。这在本文中进行了描述:“同步 FK 和导航属性之间的更改”下的关系和导航属性