更改关联时是否必须手动设置外键属性?

Ale*_*x J 9 entity-framework entity-framework-4

我正在使用Database First和DbContext从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!
}
Run Code Online (Sandbox Code Playgroud)

在L2S中,将Store关联设置为实体也会更新StoreID密钥.在EF中,这似乎并没有发生.这与实体是新的还是从上下文加载无关.

当我SaveChanges,它正确保存并StoreID更新以匹配office.ID,但为什么这只发生在保存后?

是否有我遗漏的东西,或者我现在应该手动保持外键同步?


解决方案编辑: 这称为属性修正,过去由生成的代理自动完成.但是,DbContext现在不再是这种情况了.根据这个Connect问题,这是设计的.

您好,DbContext模板实际上不会生成将用作更改跟踪代理的类 - 只是延迟加载代理(不执行修复).我们做出这个决定是因为更改跟踪代理很复杂,并且有许多细微差别,这对开发人员来说可能非常混乱.如果要在SaveChanges之前进行修复,可以调用myContext.ChangeTracker.DetectChanges.~EF团队

另一种方法是调用DbContext.Entry(entity),它将同步实体.本文描述了这一点:"同步FK和导航属性之间的更改"下的关系和导航属性

p.s*_*w.g 6

实体框架为您完成此任务.阅读关系和导航属性以获取更多信息.

通过将新对象分配给导航属性.以下代码创建课程和课程之间的关系department.如果对象附加到上下文,course则还将其添加到department.Courses集合中,并将课程对象上的相应外键属性设置为该键的属性值department.

  • course.Department = department;

但正如您所观察到的,这只发生在您调用SaveChanges上面链接的文档"同步FK和导航属性之间的更改"部分中提到的其他操作之后.

如果您使用的是没有代理的POCO实体,则必须确保调用DetectChanges方法以同步上下文中的相关对象.请注意,以下API会自动触发DetectChanges调用.

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • 对DbSet执行LINQ查询

如果这不是发生在所有的,我的猜测是,你有没有正确定义StoreID的导航属性的外键Store.