C# 已存在与此命令关联的打开的DataReader,必须先关闭它
我有这个错误,我不知道如何解决它。我在互联网上搜索如何解决问题,每次都是由一些sql代码引起的(我不理解,这不是我的情况) 代码如下:C# 已存在与此命令关联的打开的DataReader,必须先关闭它,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有这个错误,我不知道如何解决它。我在互联网上搜索如何解决问题,每次都是由一些sql代码引起的(我不理解,这不是我的情况) 代码如下: public ActionResult ConfirmarCandidatura(int id) { Candidatura candidatura = db.Candidaturas.Find(id); db.Propostas.SingleOrDefault(x => x.PropostaId == candid
public ActionResult ConfirmarCandidatura(int id)
{
Candidatura candidatura = db.Candidaturas.Find(id);
db.Propostas.SingleOrDefault(x => x.PropostaId == candidatura.PropostaId).CandidaturaAceite = candidatura;
db.Propostas.SingleOrDefault(x => x.PropostaId == candidatura.PropostaId).CandidaturaId = candidatura.CandidaturaId;
db.Candidaturas.Find(id).CandidaturaAceite = true;
var candidaturas = db.Candidaturas.Where(x => x.PropostaId == candidatura.PropostaId);
foreach(Candidatura c in candidaturas)
{
db.Candidaturas.SingleOrDefault(u => u.CandidaturaId == c.CandidaturaId).CandidaturaRejeitada = true;
}
db.SaveChanges();
return RedirectToAction("CandidaturasRecebidas","Candidaturas");
}
当您编写以下内容时:
var candidaturas = db.Candidaturas.Where(x => x.PropostaId == candidatura.PropostaId);
您没有真正关闭DataReader
。因此,当您打开另一个DataReader
db.Candidaturas.SingleOrDefault(u =>
u.CandidaturaId == c.CandidaturaId).CandidaturaRejeitada = true;
你会得到一个错误。您应该使用.ToList()
或ToArray()
或类似的语句来完成第一条语句。这将为您提供实际结果,而不是IEnumerable
作为一个单独的注释,编写
db.Propostas.SingleOrDefault(x=>x.PropostaId==candidatera.PropostaId).candidateRaceite
(您有几个类似的方法)。如果null
结果不可能则使用Single()
而不是SingleOrDefault()
。如果可能的话,在获取子字段之前检查null
,否则您将得到null异常假设candidateraid
是candiataras
的唯一键,您不需要在foreach
中调用SingleOrDefault
。只要做c.candidaterarejeitada=true代码>否则,您将对数据库进行另一次调用,以获取您已经拥有的实体。