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

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

我是实体框架和asp.net-MVC4的新手,我遇到了mysql.data异常,在google上找不到任何相关的线程。
错误如下:
已存在与此连接关联的打开的datareader,必须先关闭该datareader。
以下是我的控制器的方法:

  1. // GET: api/Partenaires_prestations
  2. [Authorize]
  3. [Route("api/Partenaires_prestations")]
  4. public List<PartenaireMapItem> GetPartenairesWithPrestations()
  5. {
  6. Random rnd = new Random();
  7. var queryString = Request.GetQueryNameValuePairs();
  8. var prestation = queryString.FirstOrDefault();
  9. return db.Partenaires
  10. .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
  11. .AsEnumerable()
  12. .Select(p => new PartenaireMapItem {
  13. IdPartenaire = p.IdPartenaire,
  14. FirstName = p.FirstName,
  15. LastName = p.LastName,
  16. NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
  17. Type = p.Type,
  18. DureeMin = 50,
  19. Lat = p.Lat,
  20. Lng = p.Lng,
  21. ImageUrl = p.ImageUrl,
  22. SeDeplace = p.SeDeplace,
  23. ADomicile = p.ADomicile,
  24. Notes = p.NoteClientPartenaires,
  25. Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
  26. }).ToList();
  27. }

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

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,

  1. Notes = p.NoteClientPartenaires,
  2. Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
  3. }).ToList();
  1. 请注意 `ToList` 将强制直接对数据库运行查询。这个 `AsEnumerable` 将取消执行,直到它被枚举。所以 `ToList` 将防止在此特定位置出现“打开数据读取器错误”。
  2. 在枚举时,我猜您的代码会触发另一个查询,从而导致给定的错误。
  3. 作为替代,你可以放弃 `AsEnumerable` 因此将构建一个查询。但是请注意,在这种情况下,查询中使用的所有函数都必须转换为sql
  4. 这是一个相关的;关于datareader,基本上是一样的:
  5. 例外:已存在与此连接关联的打开的datareader,必须先关闭它
展开查看全部

相关问题