如何在Foreach循环中更新IList中的记录?

时间:2011-04-01 18:22:42

标签: c# asp.net-mvc foreach

我的控制器正在通过一个列表,然后我需要循环并更新数据库中列表中的每个记录。我正在使用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绝对不是null。如果我通过删除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循环工作。有谁知道我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

似乎问题的最主要原因是invokeJobs集合是一个空集合。也就是说它没有元素,因此foreach循环实际上没有任何作用。

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

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

答案 1 :(得分:0)

更改此

        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循环不起作用”