实体框架新对象与DbSet.Create

时间:2018-07-26 13:35:26

标签: entity-framework proxy objectcontext

我们正在将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;

我手头的问题是我们不能在整个代码库中进行此更改。考虑到大量的代码,这实际上是不可能的。有人对此有解决方案吗?

1 个答案:

答案 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名称不匹配,但很容易找到并更正。可以通过应用程序调整表达式以适应不同的情况,我建议对每个文件或最多按项目对一个文件执行操作。

一个警告是确保您正在使用源代码管理,以便可以安全地回滚任何替换失败的尝试。