更新ObjectContext为实体框架导航属性的工作方式太不一样了

本文关键字:工作 方式太 不一样了 属性 导航 ObjectContext 实体 框架 更新 | 更新日期: 2023-09-27 18:10:10

我使用的是。edmx文件版本2,使用的是遗留的ObjectContext。

我更新到codestrategy T4,并更新了Entity Framework 6.2的引用和配置文件

我使用LazyLoadingEnabled = true(在升级之前和之后);

旧objectcontext:

ret = new PropertySet {
    display_name = DisplayName,
    id_product = IdProduct // this is a foreign key to the entity Product
};
context.PropertySets.Add(ret);
context.SaveChanges();
// calling ret.Product returns the product object with all properties filled.

New DbContext:

ret = new PropertySet {
    display_name = DisplayName,
    id_product = IdProduct // this is a foreign key to the entity Product
};
context.PropertySets.Add(ret);
context.SaveChanges();
// calling ret.Product returns null. (HERE IS THE PROBLEM)
// calling context.Entry(ret).Product.Load() loads the correct Product.

我担心这个"新"行为,因为它破坏了现有的代码,运行时错误。这是一个很大的应用程序,我们没有针对EF的测试。

我想知道是否有一些选择或错误的东西,或者它只是一种新的做事方式?我错过什么了吗?

谢谢,我真的很感激任何线索,我整天都在寻找,因为这种不同的行为已经引入了许多错误的应用程序

更新ObjectContext为实体框架导航属性的工作方式太不一样了

您不仅升级了,还从ObjectContext更改为DbContext。这也意味着从DbSet更改为DbSet。它们的行为不同,因为DbContext旨在简化事情。

问题是ObjectContext默认使用自跟踪实体(STE’s),它已经被弃用,并且在EF6中不再被官方支持(然而,你可以从EF5下载STE模板并尝试将它们适应EF6)。

PS,您的属性名违反了标准的EF命名约定,这意味着您没有从约定中获得比配置更多的好处。也就是说,你被迫配置一些你本不应该配置的东西。

如果这是你唯一的问题,那么有一些变通方法。如果不是,您可能需要投资尝试为STE调整EF5 t4模板。

这里有一篇关于使用STE的http://msdn.microsoft.com/en-us/data/jj613941

作为一种解决方法,您可以像前面那样添加Reload()方法,或者您可以像这样创建一个代理实体:
ret = context.PropertySets.Create();  // creates proxied entity
ret.display_name = DisplayName;
ret.id_product = IdProduct // this is a foreign key to the entity Product
context.PropertySets.Add(ret);
context.SaveChanges();
var name = ret.Product.Name; // should now work.

无论哪种方式,如果你想使用EF6,你将不得不进行代码更改。问题是,你想在哪做?