【问题标题】:Safe migration to EF Core 3.0安全迁移到 EF Core 3.0
【发布时间】:2020-07-27 20:10:50
【问题描述】:

我一直在将我的项目从 .net core 2.2 迁移到 3.1 LTS,并且还更新了所有 nuget 包,并且在完成所有这些过程之后,我发现我的许多 Rest API 端点由于 EF 和 DB 的一些问题而停止正常工作.

与这篇文章Breaking changes included in EF Core 3.0 相关,现在我们有大量的重大更改必须立即修复(我们不能保持原样)才能成功迁移到 .net core 3.1 和 EF 3.0。

问题是,如何安全迁移到 EF Core 3.0 以及如何找到所有需要修复 LINQ 查询的地方?

【问题讨论】:

  • 真正的变化是客户端评估默认关闭(谢天谢地!!!!)。它仅作为权宜之计存在,因为 EF Core 1.0 甚至无法执行 Group By。每次使用客户端配置时,EF Core 2.2已经发出警告,但很可能没有记录。你可以配置一个 EF Core 2.2 DbContext 来代替,如图here
  • 您可以在您的上下文中添加optionsBuilder.ConfigureWarnings(w =>w.Throw(RelationalEventId.QueryClientEvaluationWarning));,在迁移前解决问题,然后迁移到 EF Core 3.1
  • 测试,测试测试.....当然,您可以将查询转移到更容易单独测试的方法中。
  • 当然,我需要对所有查询进行测试,但我想知道是否有使用静态分析器之类的选项来显示我需要更新 LINQ 查询的所有位置。

标签: c# entity-framework .net-core entity-framework-core asp.net-core-3.1


【解决方案1】:

查询管道已针对 EF Core 3.0 完全重写,因此在技术上存在许多重大更改。

但在实践中,它归结为应该检查的几个。这些都标有high 影响。您可以忽略有关 EF Core 3.0 和 .NET Standard 2.1 的内容,因为 EF Core 3.1 再次与 .NET Standard 2.0 兼容。

在大多数情况下,只有一个具有实际影响的重大更改:

LINQ queries are no longer evaluated on the client

这是最重要的。使用AsEnumerable()ToList() 从查询中的该点显式切换到客户端评估,或手动拆分查询,您使用大量Include() 调用可能导致cartesian explosion

您也可以等待 EF Core 5(或现在使用最新预览版),它添加了 Split Queries 的功能,这是 EF Core 3.0 之前的改进版本,可以显式启用一个查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2022-11-11
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2018-08-15
    • 2020-01-29
    相关资源
    最近更新 更多