【问题标题】:How to update records from an IList in a Foreach loop?如何从 Foreach 循环中的 IList 更新记录?
【发布时间】:2011-04-01 18:22:41
【问题描述】:

我的控制器正在传递一个列表,然后我需要循环并更新数据库中列表中的每条记录。我正在使用 ASP.NET MVC 和使用 Linq to Sql 的存储库模式。下面的代码是我的保存方法,它需要将记录添加到发票表中,然后从数据库中更新作业表中的适用作业。

public void SaveInvoice(Invoice invoice,  IList<InvoiceJob> invoiceJobs)
{
    invoiceTable.InsertOnSubmit(invoice);
    invoiceTable.Context.SubmitChanges();

    foreach (InvoiceJob j in invoiceJobs)
    {
        var jobUpdate = invoiceJobTable.Where(x => x.JobID == j.JobID).Single();
        jobUpdate.InvoiceRef = invoice.InvoiceID.ToString();
        invoiceJobTable.GetOriginalEntityState(jobUpdate);
        invoiceJobTable.Context.Refresh(RefreshMode.KeepCurrentValues, jobUpdate);
        invoiceJobTable.Context.SubmitChanges();
    }
}

**我已将代码精简到问题区域。

此代码不起作用,也没有更新任何工作记录,但发票表更新正常。不会引发任何错误,并且 invoiceJobs IList 绝对不为空。如果我通过删除 foreach 循环并手动指定要更新的 JobId 来更改代码,则它可以正常工作。以下工作:

public void SaveInvoice(Invoice invoice,  IList<InvoiceJob> invoiceJobs)
{
    invoiceTable.InsertOnSubmit(invoice);
    invoiceTable.Context.SubmitChanges();

    var jobUpdate = invoiceJobTable.Where(x => x.JobID == 10000).Single();
    jobUpdate.InvoiceRef = invoice.InvoiceID.ToString();
    invoiceJobTable.GetOriginalEntityState(jobUpdate);
    invoiceJobTable.Context.Refresh(RefreshMode.KeepCurrentValues, jobUpdate);
    invoiceJobTable.Context.SubmitChanges();
}

我根本无法让 foreach 循环工作。有谁知道我在这里做错了什么?

【问题讨论】:

  • null 列表和空列表是非常不同的东西。您确定您的列表中有项目 (.Count &gt; 0)?

标签: c# asp.net-mvc foreach


【解决方案1】:

似乎这个问题最可能的原因是invokeJobs 集合是一个空集合。那就是它没有元素,因此foreach 循环实际上什么都不做。

您可以通过在方法顶部添加以下内容来验证这一点(仅用于调试目的)

if (invoiceJobs.Count == 0) {
  throw new ArgumentException("It's an empty list");
}

【讨论】:

  • 我刚试过这个,看起来列表是空的。我只是检查 null 并没有考虑检查计数,这就是为什么我认为问题出在 forloop 上。感谢您的帮助。
  • 好的,刚刚更新了我的控制器 - 这正是问题所在,现在它完全可以按照我的意愿工作。感谢您的帮助,简直不敢相信这么简单的事情让我感到了!
【解决方案2】:

改变这个

        var jobUpdate = invoiceJobTable.Where(x => x.JobID == 10000).Single();
        jobUpdate.InvoiceRef = invoice.InvoiceID.ToString();
        invoiceJobTable.GetOriginalEntityState(jobUpdate);
        invoiceJobTable.Context.Refresh(RefreshMode.KeepCurrentValues, jobUpdate);
        invoiceJobTable.Context.SubmitChanges();

        var jobUpdate = invoiceJobTable.Where(x => x.JobID == 10000).Single();
        jobUpdate.InvoiceRef = invoice.InvoiceID.ToString();
        invoiceJobTable.SubmitChanges();

看起来您的 GetOriginalEntityState 实际上并没有做任何事情,因为您没有使用返回的值。我看不出您拨打DataContext.Refresh() 的任何理由。它所做的只是删除您所做的更改,从而使您的“foreach 循环不起作用”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2010-10-08
    相关资源
    最近更新 更多