gpt4 book ai didi

c# - Entity Framework 从 6.1.x 升级到 6.2.0 会中断某些查询,除非我启用 MARS

转载 作者:IT王子 更新时间:2023-10-29 04:44:54 24 4
gpt4 key购买 nike

我最近在我们的一个大型项目中将 EF 6.1.3 升级到 6.2.0,它破坏了我们大量的 LINQ 查询。启用 MultipleActiveResultSets 会使一切再次正常工作,但我很难理解这种变化。我们使用 EF 多年,经历了多个主要版本更改,没有任何问题。如果我简单地恢复到 6.1.3,一切都会按预期再次运行 - 事实上,即使我在 6.1.3 中明确禁用 MARS,一切都会运行

让我举几个简单的例子。第一个问题是嵌套查询:

foreach(var row in dbSet.Where(<condition>))
foreach(var innerRow in otherDbSet.Where(_ => _.Property == row.Property))

这在 6.1.3 中工作正常,但在 6.2.0 中抛出“已经有一个打开的 DataReader...”异常。我了解异常的性质,我可以通过在外部查询上调用 ToList() 以首先将结果推送到内存中来解决此问题 - 我不明白的是为什么我不必在 6.1.3 中执行此操作(即使禁用了 MARS)。简单地将整个外部集加载到内存中并不总是可取的。

这似乎也会影响延迟加载的属性。例如,我们从像这样的简单查询构建组合框:

return db.Collection
.Where(<condition>)
.AsEnumerable()
.Select(_ => new ListItem(_.Id, _.LazyNavigationProperty.Description))
.ToList();

这在 6.1.3 中工作正常,但在 6.2.0 中再次抛出“There is already an open DataReader...”异常。解决方法是我现在必须预先加载导航属性。

最终我没有明确的问题,我只是想了解为什么次要版本更新似乎导致查询处理方式发生重大变化。

展望 future ,这会影响我们重构的太多查询。当我研究这个问题时,我看到关于启用 MARS 的模糊警告,但没有人真正给出任何具体的信息。是否有令人信服的理由不启用它?

最佳答案

你得到这个错误是因为你在尝试打开另一个结果集时迭代一个结果集(而第一个结果集还没有完成)-> 一种延迟加载(你的情况下的第一个'for each'迭代) -> 正如您已经亲眼所见,有很多方法可以解决这个问题:使用 toList(首先放入内存),因为它不再使用数据读取器打开集合。

它看起来可能与 6.2 中的错误修复有关(发行说明:https://entityframework.net/ef-version-history)- 看起来与以下内容有关:“错误:重试查询或 SQL 命令失败并显示“SqlParameter 已包含在另一个 SqlParameterCollection 中。 ")

关于启用 MARS:你可以在这里找到特别警告:

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets

关于c# - Entity Framework 从 6.1.x 升级到 6.2.0 会中断某些查询,除非我启用 MARS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47208528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com