2013-03-21 33 views
9

我使用Database First和DbContext从Linq-to-SQL迁移到实体框架(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中,这似乎没有发生。这与实体是新的还是从上下文加载无关。

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

有什么我失踪了,或者我现在应该保持外键手动同步吗?


解决方案编辑: 这就是所谓的属性修正,并用于由生成的代理自动完成。但是,与DbContext这不再是这种情况。根据this Connect issue,这是设计。

你好, 的模板的DbContext实际上并不产生将被用作变化跟踪代理类 - 只是懒加载代理(不这样做修复时)。我们做出这个决定是因为更改跟踪代理非常复杂,并且有很多细微差别,可能会让开发人员感到困惑。 如果您想要在SaveChanges之前进行修复,您可以调用myContext.ChangeTracker.DetectChanges。 〜EF团队

另一种方法是调用DbContext.Entry(entity),它将同步实体。本文中介绍了这一点:Relationships and Navigation Properties在“同步FK和导航属性之间的更改”下。

+0

很难理解没有更多的人欣赏这种解决方案。没有人用这种方式使用dbcontext? – danihp 2013-07-10 08:38:12

+0

就我个人而言,我现在只需在每次更改关联时手动设置密钥。修复是一件很好的事情,但经过一番思考,预计POCO无论如何都没有多大意义。任何改变关联的操作无论如何都应该在某个领域层方法中抽象出来,所以最终它不会像我想的那样令人不安。 – 2013-07-10 09:26:31

+0

我是通过dbEntityValidations与所有业务规则“盲”的实体能够将实体展示给UI层,至少对于“简单”实体。我使用'entry.related'来处理lazyloading相关实体,但使用detectChanges方法。感谢您的帖子和解决方案。 – danihp 2013-07-10 09:52:06

回答

6

否。实体框架为您执行此操作。阅读Relationships and Navigation Properties了解更多信息。

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

  • course.Department = department;

但是当你发现,你叫SaveChanges或“同步FKS和导航性能之间的变化”部分中提到的其他行动之一后,这只是发生上面链接的文件。

如果您正在使用POCO实体,无需代理,您必须确保 该DetectChanges方法被调用到相关 对象在上下文同步。请注意,以下API会自动触发一次DetectChanges调用。

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • 的DbContext。条目
  • DbChangeTracke r.Entries
  • 执行LINQ查询针对DbSet

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

+1

我认为发生了什么在链接的文章底部的“同步FK和导航属性之间的更改”中进行了介绍。调用'e.Entry(office)'同步这些ID。但是,我可以在调试器中看到代理正在创建,所以它*应该*工作... – 2013-03-21 17:16:49

+0

@IliaJerebtsov啊正确。我最初误解了你的问题。我以为你说这根本没有发生。 – 2013-03-21 17:20:41

+0

谢谢,我已经想通了,显然缺乏fixup是由DbContext API设计的。 – 2013-03-21 18:09:29

相关问题