【问题标题】:Entity Framework new object vs DbSet.Create实体框架新对象与 DbSet.Create
【发布时间】:2018-07-26 13:35:26
【问题描述】:

我们正在将 Web 应用程序从 EF 4.0 迁移到 EF 6。实体早期基于 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;

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

【问题讨论】:

  • 我不明白你为什么不能做出改变。如果您没有活动的 ObjectContext,那么延迟加载将不会在 EF 4 中工作。因此,如果您在创建实体时在范围内有 DbContext,则应该能够搜索和替换以进行此更改。也许如果您包含一个较长的示例,说明您尝试迁移的 EF 4 代码。
  • 我无法进行更改,因为有 8000 个地方必须进行更改。我无法做出如此巨大的改变并对其进行测试。
  • 所以您的计划是将这 8000 个位置从 EF4 ObjectContext 更改为 EF6 DbContext 并且不测试
  • 不,一点也不。我不必进行这些更改,因为 Code 引用的是上下文对象而不是类。

标签: entity-framework proxy objectcontext


【解决方案1】:

如果您的实体易于识别,例如所有实体都是从命名空间“EntityModel”中提取的,那么 VS 的 Find & Replace 可以帮助进行转换。最终,您将不得不承担技术债务的成本。重构不是免费的,但进行改进(不仅仅是升级依赖版本)带来的好处应该超过成本。

使用查找和替换:

查找:= 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();

导致:

var user = context.Users.Create();
var test = context.Tests.Create();
var fudge = context.Fudges.Create();

现在这将提取类名并将其复数为“s”,这可能不会 100% 匹配实体 DBSet 名称,但这些名称很容易找到并更正。可以通过应用程序调整表达式以适应差异,我建议逐个文件或最多逐个项目地执行操作。

需要注意的是,请确保您使用源代码控制运行,以便可以安全地回滚任何错误的替换尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多