C# 已存在与此命令关联的打开的DataReader,必须先关闭它

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

我有这个错误,我不知道如何解决它。我在互联网上搜索如何解决问题,每次都是由一些sql代码引起的(我不理解,这不是我的情况)

代码如下:

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否则,您将对数据库进行另一次调用,以获取您已经拥有的实体。