mysql.data.mysqlclient.mysqlexception-已经有一个与此连接关联的打开的datareader,必须先关闭它

qgzx9mmu  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(500)

我是实体框架和asp.net-MVC4的新手,我遇到了mysql.data异常,在google上找不到任何相关的线程。
错误如下:
已存在与此连接关联的打开的datareader,必须先关闭该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();
}

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

ee7vknir

ee7vknir1#

问题是您在同一个连接上同时运行多个查询。
错误就是这样的结果。你可以选择允许它,或者修复它。
让我们修复它(免责声明;这里有点猜测):
在代码中,有两个查询正在连接上运行。你可以很容易地通过改变 AsEnumerableToList ```
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,基本上是一样的:
例外:已存在与此连接关联的打开的datareader,必须先关闭它

相关问题