【问题标题】:Why is MySQL throwing DataReader Exception when used for EF为什么 MySQL 在用于 EF 时会抛出 DataReader 异常
【发布时间】:2018-10-21 23:04:33
【问题描述】:

我一直在尝试将 MySQL 与 Entity Framework 6 一起使用。我有几个项目成功地使用 SQL Server Express 没有问题。新项目基于以前的项目,我需要进行一些小的更改来连接和播种 EF 数据库。我现在遇到的问题是,在 SQL Server 上运行良好的简单查询在使用 MySQL 时会引发异常。

涉及两个表/实体。 Device 是收集数据样本的物理设备的表示。 Monitor 是要采样的数据类型的定义。因此,为每个设备定义了多个监视器。一旦我尝试检索设备的监视器列表,它就会引发以下错误:

MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.

代码如下:

using (var context = new ApplicationDbContext())
{
    foreach (var device in context.Devices)
    {
        var monitors = device.Monitors.Where(m => m.Enabled == true).ToList();

        if (monitors.Count > 0)
        {
            // Get sampled data from device
        }
    }
}

我猜这是关于他们的 EF 实现的 MySQL 驱动程序问题。任何人有任何想法如何纠正或解决它?我是否在做一些我没有看到的非常愚蠢和明显的事情?在我的 SQL Server 实现中,我一直使用这些相同的模式来访问相关实体。所以,我担心这将成为使用 MySQL 的阻碍,至少在其内置驱动程序中是这样。

一些相关信息:

.NET:4.5.2

EF:6

MySQL:5.7

MySqlClient:6.9.11.0

【问题讨论】:

  • 三个快速的想法:1) 将两个查询合并为一个 LINQ 查询 2) 在开始第二个查询之前耗尽 context.Devices 的 IQueryable; 3)激活相当于SQL Server的“多个活动结果集”(MARS)for your MySql connection
  • 这是有道理的。我以前从未遇到过这种情况,因为我一直用于 SQL Server 的数据库连接启用了 MARS。我希望 MySqlClient 也能实现 MARS。不过,我可能应该重新评估我的 ling 查询以尝试完全消除这种情况。感谢您的帮助。
  • “我希望 MySqlClient 也实现 MARS。”这是不可能的,因为这是 MySQL 服务器本身的限制(在 MySQL 协议dev.mysql.com/doc/internals/en/client-server-protocol.html 中没有指定的方法可以在一个连接上多路复用多个结果集)。

标签: c# mysql entity-framework exception datareader


【解决方案1】:

发生这种情况是因为context.Devices 保持MySqlDataReader 打开(以延迟传输结果),但device.Monitors.Where(...) 尝试在同一连接上执行第二个查询。

我可以想到两种解决方法:

1。强制评估第一个查询

使用.ToList() 强制将所有结果带入内存:

foreach (var device in context.Devices.ToList())

请注意,这是不必要的低效,因为它可能会将大量您可能不需要的数据带回内存。

2。将两个查询合并为一个

foreach (var device in context.Devices.Where(d => d.Monitors.Any(m => m.Enabled)))
{
    // Get sampled data from device
}

这应该会导致 EF 构造一个更高效的查询,该查询仅检索您需要的 device 对象并避免“已经打开的 DataReader”错误。

【讨论】:

  • 是的,这些应该会让事情朝着正确的方向发展。正如我上面提到的,我之前没有遇到这个问题的原因是我的 SQL Server 连接上启用了 MARS。
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多