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