c# - MySql.Data.MySqlClient.MySqlException - 已经有一个与此连接关联的打开的 DataReader,必须先将其关闭

标签 c# mysql asp.net asp.net-mvc entity-framework

我是 Entity Framework 和 asp.net-mvc 4 的新手,我遇到了 Mysql.Data 异常,并且在 google 上找不到任何相关线程。

错误如下:

There is already an open DataReader associated with this Connection which must be closed first.

这是我的 Controller 的方法:

// GET: api/Partenaires_prestations
[Authorize]
[Route("api/Partenaires_prestations")]
public List<PartenaireMapItem> GetPartenairesWithPrestations()
{
     Random rnd = new Random();

     var queryString = Request.GetQueryNameValuePairs();

     var prestation = queryString.FirstOrDefault();

     return db.Partenaires
         .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
         .AsEnumerable()
         .Select(p => new PartenaireMapItem {
             IdPartenaire = p.IdPartenaire,
             FirstName = p.FirstName,
             LastName = p.LastName,
             NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
             Type = p.Type,
             DureeMin = 50,
             Lat = p.Lat,
             Lng = p.Lng,
             ImageUrl = p.ImageUrl,
             SeDeplace = p.SeDeplace,
             ADomicile = p.ADomicile,

             Notes = p.NoteClientPartenaires,
             Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
         }).ToList();
}

感谢所有花时间阅读/回答我的帖子的人。

最佳答案

问题在于您在同一个连接上同时运行多个查询。

该错误就是由此造成的。您可以选择允许它,或修复它。

让我们修复它(免责声明;这里有一点猜测):

在您的代码中,您的连接上有 2 个正在运行的查询。您可以通过将 AsEnumerable 更改为 ToList

轻松修复此问题
db.Partenaires
         .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
         //note: the change is here
         .ToList()
         .Select(p => new PartenaireMapItem {
             IdPartenaire = p.IdPartenaire,
             FirstName = p.FirstName,
             LastName = p.LastName,
             NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
             Type = p.Type,
             DureeMin = 50,
             Lat = p.Lat,
             Lng = p.Lng,
             ImageUrl = p.ImageUrl,
             SeDeplace = p.SeDeplace,
             ADomicile = p.ADomicile,

             Notes = p.NoteClientPartenaires,
             Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
         }).ToList();

请注意ToList 将强制查询直接针对数据库运行。 AsEnumerable 将推迟执行,直到它被枚举为止。因此,ToList 将防止此特定位置出现“开放数据读取器错误”。

在枚举时,我的猜测是,您的代码触发了另一个查询,从而导致给定的错误。

<小时/>

作为替代方案,您可以完全删除 AsEnumerable ,以便构建单个查询。但请注意,在这种情况下,查询中使用的所有函数都必须转换为 SQL。

<小时/>

这是一个相关的;关于datareader,基本上是一样的:

Exception: There is already an open DataReader associated with this Connection which must be closed first

关于c# - MySql.Data.MySqlClient.MySqlException - 已经有一个与此连接关联的打开的 DataReader,必须先将其关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51784648/

相关文章:

php - 从表中取出一个带逗号的数据

c# - 为什么以编程方式检查复选框会导致其关联事件在下一次回发时触发?

c# - .NET DateTime ToString Culture en-US 在一些盒子上输出 4 位数年份,在其他盒子上输出 2 位数年份

c# - spring.net 如何注入(inject)方法?

c# - Azure 函数针对同一服务总线队列消息多次运行

c# - 电子邮件未在 azure 网络应用程序中发送

c# - Unity3D项目配置: Treat warnings as errors

mysql - 在 Laravel 5.2 中如何从 html 表单获取输入并将其存储在数据库中?

mysql - mariadb sql 默认 unix_timestamp

c# - ASP.NET MVC 项目构建在 travis-ci 上开始失败