我使用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和导航属性之间的更改”下。
很难理解没有更多的人欣赏这种解决方案。没有人用这种方式使用dbcontext? – danihp 2013-07-10 08:38:12
就我个人而言,我现在只需在每次更改关联时手动设置密钥。修复是一件很好的事情,但经过一番思考,预计POCO无论如何都没有多大意义。任何改变关联的操作无论如何都应该在某个领域层方法中抽象出来,所以最终它不会像我想的那样令人不安。 – 2013-07-10 09:26:31
我是通过dbEntityValidations与所有业务规则“盲”的实体能够将实体展示给UI层,至少对于“简单”实体。我使用'entry.related'来处理lazyloading相关实体,但使用detectChanges方法。感谢您的帖子和解决方案。 – danihp 2013-07-10 09:52:06