我们正在将Web应用程序从EF 4.0迁移到EF6。这些实体以前是基于ObjectContext的,但是现在我们正在研究DBContext。该代码在很大程度上取决于延迟加载。使用以下语法添加实体:
var user = new EntityModel.User();
user.DepratmentId=25;
context.Users.Add(user);
context.SaveChanges();
var name = user.Department.Name;
原始代码很容易将部门名称分配给变量名称。在使用DBContext将实体框架升级到EF6之后,user.Department为空。我了解当我们使用DBContext时,延迟加载仅适用于代理。如果将代码更改为以下内容,它将可以正常工作:
var user = context.Users.Create();
user.DepratmentId=25;
context.Users.Add(user);
context.SaveChanges();
var name = user.Department.Name;
我手头的问题是我们不能在整个代码库中进行此更改。考虑到大量的代码,这实际上是不可能的。有人对此有解决方案吗?
答案 0 :(得分:0)
只要您的实体易于识别,例如所有实体都从名称空间“ EntityModel”中拉出,则VS的“查找和替换”可以帮助您进行过渡。最终,您将不得不承担技术债务的费用。重构不是免费的,但是进行改进(不仅仅是升级依赖项版本)带来的收益应该超过该成本。
使用“查找并替换”:
查找:output_data
替换:= new EntityModel.(?<class>.*)\(\)
这将找到类似的实例:
= context.${class}s.Create()
并替换为var user = new EntityModel.User();
具有以下条件的测试:
var user = context.Users.Create();
导致:
var user = new EntityModel.User();
var test = new EntityModel.Test();
var fudge = new EntityModel.Fudge();
现在,这将提取类名称,并使用“ s”将其复数,这可能与100%的实体DBSet名称不匹配,但很容易找到并更正。可以通过应用程序调整表达式以适应不同的情况,我建议对每个文件或最多按项目对一个文件执行操作。
一个警告是确保您正在使用源代码管理,以便可以安全地回滚任何替换失败的尝试。