已经有与此命令关联的打开的DataReader,必须先关闭它

时间:2018-12-29 00:44:18

标签: c# asp.net-mvc linq

我有此错误,我不知道如何解决。我搜索了如何在互联网上解决问题,以及每次它是由某些sql comand(我不了解,不是我的情况)引起的。

这是代码:

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");
    }

1 个答案:

答案 0 :(得分:2)

当您编写以下内容时:

public interface IAnimal {
    IOwner Owner { get; }
}

public abstract class Mammal : IAnimal { ... }

public class Dog : Mammal { ... }

您并没有真正关闭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 == candidatura.PropostaId).CandidaturaAceite结果,请使用null而不是Single()。如果有可能,请在获取子字段之前检查SingleOrDefault()-否则将获得NullException