为什么 MySQL 在用于 EF 时抛出 DataReader 异常
Why is MySQL throwing DataReader Exception when used for EF
我一直在尝试将 MySQL 与 Entity Framework 6 一起使用。我有几个项目成功地使用了 SQL Server Express,没有任何问题。新项目基于以前的项目,我需要进行一些小的更改才能连接到 EF 数据库并为其提供种子。我现在 运行 遇到的问题是,在 SQL 服务器上运行良好的简单查询在使用 MySQL.
时抛出异常
涉及两个tables/entities。 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
}
}
}
我猜这是一个 MySQL 驱动程序问题,与他们的 EF 实现有关。任何人有任何想法如何纠正或解决它?我是否在做一些我只是没有看到的非常愚蠢和明显的事情?在我的 SQL 服务器实现中,我一直使用这些相同的模式来访问相关实体。所以,我担心这将成为使用 MySQL 的阻碍,至少对于他们的内置驱动程序是这样。
一些相关信息:
.NET: 4.5.2
EF: 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
对象并避免 "already an open DataReader" 错误。
我一直在尝试将 MySQL 与 Entity Framework 6 一起使用。我有几个项目成功地使用了 SQL Server Express,没有任何问题。新项目基于以前的项目,我需要进行一些小的更改才能连接到 EF 数据库并为其提供种子。我现在 运行 遇到的问题是,在 SQL 服务器上运行良好的简单查询在使用 MySQL.
时抛出异常涉及两个tables/entities。 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
}
}
}
我猜这是一个 MySQL 驱动程序问题,与他们的 EF 实现有关。任何人有任何想法如何纠正或解决它?我是否在做一些我只是没有看到的非常愚蠢和明显的事情?在我的 SQL 服务器实现中,我一直使用这些相同的模式来访问相关实体。所以,我担心这将成为使用 MySQL 的阻碍,至少对于他们的内置驱动程序是这样。
一些相关信息:
.NET: 4.5.2
EF: 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
对象并避免 "already an open DataReader" 错误。