c# - 为什么 MySQL 在用于 EF 时抛出 DataReader 异常

标签 c# mysql entity-framework exception datareader

我一直在尝试将 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

英孚:6

MySQL:5.7

MySqlClient: 6.9.11.0

最佳答案

发生这种情况是因为 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”错误。

关于c# - 为什么 MySQL 在用于 EF 时抛出 DataReader 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50293856/

相关文章:

c# - 如何缓存 .NET Web API 请求(并使用 w/AngularJS $http)

PHP ORDER BY 不工作嵌套查询

mysql - 如何为具有 FK 关系的表创建插入脚本

c# - foreach 中的动态过滤(ASP.NET 和 EF)

c# - MVC C# 在不删除数据库的情况下更改数据库结构

c# - 在公共(public)方法中分配对象

c# - 我如何使用 XNA 中的着色器为单个像素着色?

entity-framework - 映射时转换值

c# - 值 'xx/xx/xxxx' 对 "y"无效 - Jquery Datepicker DateTime

javascript - JQUERY + PHP + AJAX 不起作用