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和导航属性之间的更改"下的关系和导航属性
实体框架为您完成此任务.阅读关系和导航属性以获取更多信息.
通过将新对象分配给导航属性.以下代码创建课程和课程之间的关系
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
.
归档时间: |
|
查看次数: |
4591 次 |
最近记录: |