LINQ to SQL: DataContext.SubmitChanges не обновляется немедленно - PullRequest
0 голосов
/ 14 января 2011

У меня забавная проблема.

При выполнении DataContext.SubmitChanges () обновление Count () выполняется одним способом, но не другим, см. Мой комментарий в приведенном ниже коде.
(DC - это DataContext)

  Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName);
  DataCompliance compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

  if (compliances.Count() == 0) // Insert if not exists
  {
    DC.DataCompliances.InsertOnSubmit(new DataCompliance {
      FKCompany = c.Id,
      FKComplianceCriteria = criteria.Id
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

    // At this point DC.DataCompliances.Count() has increased,
    // but compliances.Count() is still 0
    // When I refresh the page however, it will be 1
  }

Почему это происходит?

Мне нужно обновить compliances сразу после его вставки.У кого-нибудь есть решение?

Ответы [ 2 ]

4 голосов
/ 14 января 2011

Существует разница между добавлением объекта в контекст данных (и распространением его обратно в базу данных) и добавлением его в связанную коллекцию объектов объекта, который вы извлекли из базы данных.После того как вы извлекли объект и связанные с ним объекты, внесение изменений в данные в базе данных не будет отражено в извлеченном объекте, поскольку база данных не требуется.Ключевой бит - это SingleOrDefault() для компании, который заставляет выполнить запрос и присвоить извлеченные данные.Перечисление связанных объектов приведет к их загрузке, если они еще не загружены.Таким образом, даже после обновления базы данных ранее извлеченный объект не будет отражать обновление.Однако вы можете добавить вставленный объект в коллекцию соответствия данных компании, а затем выполнить обновление, и это будет именно то, что вы ожидаете.Обратите внимание, что я думаю, что вам все еще нужно назначить связанный объект, который вы используете в своем чеке.Обновление страницы также решает проблему, поскольку данные запрашиваются из базы данных, обновляются связанные коллекции сущностей, а также таблицы в контексте данных.

Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName);
var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

if (compliances.Count() == 0) // Insert one if not exist yet
{
    c.DataCompliances.Add( new DataCompliance
    {
        ComplianceCriteria = criteria
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}

Оригинал (оставленоcontext)

Что если вы попытаетесь назначить ассоциированный объект вместо его идентификатора?Я считаю, что присвоение идентификатора фактически не заполняет связанный объект, который проверяется, и SubmitChanges только распространяет данные обратно в БД, а не обновляет элемент таблицы данными для связанного объекта.

var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

if (compliances.Count() == 0) // Insert one if not exist yet
{
    DC.DataCompliances.InsertOnSubmit(new DataCompliance {
        FKCompany = c.Id,
        ComplianceCriteria = criteria
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}
1 голос
/ 14 января 2011

Измените c.DataCompliances.Where... на DC.DataCompliances.Where...

DC - это контекст данных, каково определение c

...