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

时间:2018-08-10 10:38:11

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

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

这是错误:

  

已经有一个与此连接相关联的打开的DataReader,必须先关闭它。

这是我控制器的方法:

// 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();
}

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

1 个答案:

答案 0 :(得分:1)

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

该错误是由此导致的。您可以选择允许或修复它。

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

在您的代码中,您的连接上有两个正在运行的查询。您可以通过将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。


这是一个相关的;关于数据读取器,基本上是相同的:

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