实体框架从 6.1.x 升级到 6.2.0 会破坏某些查询,除非我启用 MARS

2023-12-19

我最近在我们的一个大型项目中将 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 中再次抛出“已经有一个打开的 DataReader...”异常。解决方法是我现在必须立即加载导航属性。

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

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


您收到此错误是因为您在尝试打开另一个结果集时迭代结果集(而第一个结果集尚未完成)-> 某种延迟加载(在您的情况下是第一个“for every”迭代)->有很多方法可以解决这个问题,正如您已经亲眼所见:使用 toList (首先放入内存),因为它不再使用 datareader 来打开集合。

看起来它可能与 6.2 中的错误修复有关(发行说明:https://entityframework.net/ef-version-history 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 https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架从 6.1.x 升级到 6.2.0 会破坏某些查询,除非我启用 MARS 的相关文章

随机推荐

  • 如何只显示“今天”而不显示其他内容?

    如果日期时间在今天之内 我只想 今天 moment calendar Today at 5 08PM Use a 自定义区域设置 http momentjs com docs customization calendar moment lo
  • 当无法测量差异时如何处理 iterator::difference_type ?

    我正在为第三方 C 库编写 C 包装器 该库提供了一些用于迭代一系列对象的函数 我想编写一个迭代器来包装此行为 以便迭代更容易 但我无法想象如何能够提供强制的 差异 类型 因为迭代的对象没有有意义的相对顺序以及我正在使用的 API with
  • q.all 用于 angular2 observables

    是否有类似 q all 的东西可以解析 angular2 中的所有 http api 请求 在 angular1 中 我可以做这样的事情 var promises api getA api getB q all promises then
  • 使用 JS 计算两个值之间的色差/相似度%

    我需要计算两个十六进制颜色值之间的差异 因此输出是百分比值 我放弃的第一件事是将十六进制值转换为十进制 因为第一个值的权重比最后一个值高得多 第二个选项是计算每个 RGB 值之间的差异 然后将它们全部相加 然而 之间的区别0 0 0 and
  • 如何在iPhone上进行捏合手势?

    如何在 iPhone 上实现捏合手势 我熟悉在 iPhone 上使用触摸事件 但我非常懒 不想为像捏手势这样广泛使用的东西重新发明轮子 源代码或链接会很有帮助 您需要使用一些基本的数学知识自己实现它 void touchesBegan NS
  • 当视图控制器推到导航控制器上时,后退按钮不可见

    当点击单元格时 我使用导航控制器深入查看详细视图 当我将视图控制器推入导航控制器堆栈时 我希望看到一个后退按钮 可以点击该按钮将前一个视图从堆栈中弹出 问题是后退按钮不可见 但是当点击它时shouldbe 让我回到之前的视图 有什么问题 确
  • .NET Framework - 可能存在内存泄漏的类?

    就在前几天 我正在调查内存泄漏 该泄漏在不到两分钟的时间内使应用程序从约 50MB 膨胀到约 130MB 事实证明问题出在并发队列 http msdn microsoft com en us library dd267265 aspx班级
  • 选择选项使用 JQUERY 通过文本获取值[重复]

    这个问题在这里已经有答案了 我有 html 选择 下拉菜单 其中包含许多填充选项 我还有一个包含许多名称的表格 旁边有按钮 我需要当您按下任何名称旁边的按钮时 就会在选择框 下拉列表 中选择该名称 选项值是 id 选项文本是名称 例子 Na
  • 是否可以序列化 Ace Session 对象?

    我想序列化并存储 Ace Session 对象 这样我就可以打开一个 文件 并恢复所有内容 值 选择 光标位置 模式等 我试过了JSON stringify session 它会抛出一个循环错误 有任何想法吗 最简单的版本是 var ses
  • 有没有办法在 C# 5 中模仿 C# 6 空条件运算符

    我遇到一种情况 我需要在对象初始值设定项内分配一些对象的属性 其中一些对象可以为 null 我需要访问它们的属性 问题是它们太多 并且使用 if else 东西不好 Example visits visitJoins AsEnumerabl
  • Mersenne Twister 跨编译器的再现性[重复]

    这个问题在这里已经有答案了 我正在使用 std mt19937 64 生成随机数序列 我注意到 当在同一平台上使用相同的种子运行 GCC 和 Clang 时 我获得了不同的序列 我通过 Valgrind 运行该程序 发现没有未初始化的内存
  • conda 返回“解决环境:失败”

    我无法再使用 conda 实用程序 多年来我经常使用它 但最近 因为我安装了 python 模块scp 使用命令conda install scp 我不知道这是否重要 没有任何明显异常的情况 只要我使用 conda 无论命令如何 我都会收到
  • 使用 Node.js 实时抓取网页

    好处是使用 Node js 抓取网站内容 我想构建一个非常非常快的东西 可以以以下方式执行搜索皮划艇网站 http www kayak com 其中一个查询被分派到多个不同的站点 结果被抓取 并在可用时返回给客户端 我们假设这个脚本应该只提
  • 使用 printf() 将字符串居中

    默认情况下 printf 似乎将字符串向右对齐 printf 10s 20s 20s n col1 col2 col3 col1 col2 col3 我还可以像这样将文本向左对齐 printf 10s 20s 20s col1 col2 c
  • 对 Rcharts 使用百分比宽度

    我想知道如何使用 而不是 px 设置 rChart 的宽度 我在源代码中注意到它默认为像素 我试图在一个闪亮的应用程序中使用它 并且用图表修复似乎是一个问题 因为它们不随用户界面的其余部分扩展 有没有解决的办法 这应该被视为黑客攻击 因为两
  • Rails 有内置的分页解决方案吗?

    我注意到分页宝石就像mislav will paginate很受欢迎 这是因为Rails没有内置的分页解决方案还是因为内置的解决方案不是很好 在 Rails 2 0 中 ActionController 的分页功能被删除 并变成了一个名为
  • C 中的原子读取

    根据C 对 int 的读写是原子的吗 https stackoverflow com questions 54188 are c reads and writes of an int atomic 由于处理器缓存的问题 整数的读取 因此指针
  • 为什么 Python 脚本可以在 CLI 中运行,但在 cron 作业调用时却不能运行?

    我创建了一个 Python 脚本 我想通过 Ubuntu 服务器上的 cronjob 每天运行它 这是从命令行运行该脚本的方式 python home username public html IDM app manage py clean
  • 增强多索引容器的模板参数

    我需要创建一个包含多索引容器作为存储的通用类 当我编译时 它给出如下错误 其中我定义了第 n 个索引视图 错误 非模板 nth index 用作模板 connection manager 模板 类 conn mgr boost noncop
  • 实体框架从 6.1.x 升级到 6.2.0 会破坏某些查询,除非我启用 MARS

    我最近在我们的一个大型项目中将 EF 6 1 3 升级到 6 2 0 它破坏了我们大量的 LINQ 查询 启用 MultipleActiveResultSets 会使一切再次正常工作 但我很难理解这种变化 我们已经使用 EF 多年 并且经历