【问题标题】:There is already an open DataReader associated with this Command, which must be closed first已经有一个打开的DataReader与这个Command关联,必须先关闭
【发布时间】:2018-12-29 08:54:41
【问题描述】:

我有这个错误,我不知道如何解决它。我在互联网上搜索了如何解决,每次都是由一些 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");
    }

【问题讨论】:

  • 假设 CandidaturaIdCandiaturas 的唯一键,您不需要在 foreach 中调用 SingleOrDefault。只需执行c.CandidaturaRejeitada = true; 否则您将再次调用数据库以获取您已经拥有的实体。

标签: c# asp.net-mvc linq


【解决方案1】:

当你写下以下内容时:

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()。如果它可能的,在获取子字段之前检查null - 否则你会得到NullException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2011-08-29
    • 2020-09-25
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多