Как обновить записи из IList в цикле Foreach? - PullRequest
4 голосов
/ 01 апреля 2011

Мой контроллер проходит через список, который мне затем нужно перебрать и обновить каждую запись в списке в моей базе данных.Я использую 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 работать вообще.Кто-нибудь знает, что я здесь делаю не так?

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Похоже, что наиболее вероятной причиной этой проблемы является то, что коллекция invokeJobs является пустой коллекцией.То есть он не имеет элементов, следовательно, цикл foreach фактически ничего не делает.

Это можно проверить, добавив следующее в начало метода (только для целей отладки)

if (invoiceJobs.Count == 0) {
  throw new ArgumentException("It's an empty list");
}
0 голосов
/ 01 апреля 2011

Измените это

        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 не работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...