C# 如何在Foreach循环中从IList更新记录?

C# 如何在Foreach循环中从IList更新记录?,c#,asp.net-mvc,foreach,C#,Asp.net Mvc,Foreach,我的控制器正在传递一个列表,然后我需要循环并更新数据库中列表中的每个记录。我正在使用ASP.NETMVC和使用LINQtoSQL的存储库模式。下面的代码是我的保存方法,需要将记录添加到发票表中,然后从数据库更新作业表中的适用作业 public void SaveInvoice(Invoice invoice, IList<InvoiceJob> invoiceJobs) { invoiceTable.InsertOnSubmit(invoice); invoiceT

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

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();
    }
}
公共作废保存发票(发票发票,IList invoiceJobs)
{
可开票。InsertOnSubmit(发票);
invoiceTable.Context.SubmitChanges();
foreach(invoiceJobs中的InvoiceJob j)
{
var jobUpdate=invoiceJobTable.Where(x=>x.JobID==j.JobID).Single();
jobUpdate.InvoiceRef=invoice.InvoiceID.ToString();
invoiceJobTable.GetOriginalEntityState(作业更新);
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();
}
公共作废保存发票(发票发票,IList invoiceJobs)
{
可开票。InsertOnSubmit(发票);
invoiceTable.Context.SubmitChanges();
var jobUpdate=invoiceJobTable.Where(x=>x.JobID==10000).Single();
jobUpdate.InvoiceRef=invoice.InvoiceID.ToString();
invoiceJobTable.GetOriginalEntityState(作业更新);
invoiceJobTable.Context.Refresh(RefreshMode.KeepCurrentValues,jobUpdate);
invoiceJobTable.Context.SubmitChanges();
}

我就是无法让foreach循环工作。有人知道我做错了什么吗?

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

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

改变这个

        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();


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

A
null
列表和空列表是完全不同的事情。你确定你的列表中有项目吗(
.Count>0
)?我刚刚尝试了这个,但列表似乎是空的。我只是检查null,没有考虑检查计数,这就是为什么我认为问题出在forloop上。谢谢你的帮助。好的,刚刚更新了我的控制器-这正是问题所在,现在它的工作方式完全符合我的要求。谢谢你的帮助,真不敢相信这么简单的事就把我弄到手了!
        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();