我是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();
}
感谢所有愿意花时间阅读/回答我的帖子的人。
答案 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。
这是一个相关的;关于数据读取器,基本上是相同的: