EF 4.1 DBContext и свойства навигации - PullRequest
2 голосов
/ 18 февраля 2012

Некоторое время мы использовали EF STE, но наше приложение немного выросло, и мы решили подать в суд на новый 4.1 DbContext, чтобы мы могли «развивать» отдельный бизнес-уровень поверх нашего уровня данных без необходимости используйте для этого разные типы.

В элементарной оценке способа ведения дел DbContext я сталкиваюсь с небольшой проблемой.

Я привык запрашивать и предварительно загружать необходимые связанные данные, такие как:

return context.Orders.Include("Detail").SingleOrDefault(ord => ord.ID == ID);

А затем отправьте возвращенный объект в пользовательский интерфейс для модификации, а при возврате из пользовательского интерфейса сохраните изменения в базе данных.

Из того, что я читал до сих пор, "сохранение изменений" в DbContext легко сделать с помощью следующего кода:

context.Entry(order).State = EntityState.Modified;

Проблема этого кода в том, что он фактически помечает все свойства объекта как измененные, что недопустимо для некоторых свойств в моей модели (бизнес-правило).

Я прибег к следующему решению (которое, по-видимому, требует большого количества кода для относительно небольшого требования! Кстати, изменение измененного состояния свойства на Неизменное не поддерживается):

context.Orders.Attach(order);

DbEntityEntry<Order> ordEntity = context.Entry(order);

string[] arr =
{
      ordEntity.Property(ord => ord.ID).Name,
      ordEntity.Property(ord => ord.ClientID).Name,
};

foreach (string prop in ordEntity.OriginalValues.PropertyNames)
{
      if (!arr.Contains(prop))
      {
            ordEntity.Property(prop).IsModified = true;
      }
}

context.SaveChanges();

Проблема, с которой я сталкиваюсь в этом коде, заключается в том, что оператор «Attach» выдает исключение, говорящее о том, что в свойствах навигации в прикрепленном объекте есть какой-то конфликт, даже если вообще ничего не было сделано! (сохранение объекта в точности так, как он был извлечен из базы данных). Сообщение об ошибке выглядит примерно так: «Обнаружены конфликтующие изменения в роли« Подробности »отношения« OrdersDatamodel.FK_Order_Detail ».»

Вопросы:

  1. Существует ли более "элегантный" способ предотвращения изменения определенных свойств объекта?
  2. Кто-нибудь знает, что происходит с исключением, возникающим при присоединении объекта к контексту?

Спасибо.

1 Ответ

2 голосов
/ 18 февраля 2012

Из того, что я читал до сих пор, "сохранение изменений" в DbContext легко сделать с помощью следующего кода:

context.Entry(order).State = EntityState.Modified;

Вам редко нужноявно установить состояние.Когда вы изменяете свойства, предполагая, что они virtual, состояние автоматически изменится на Modified без необходимости его установки.В противном случае, DetectChanges подберет это во время вашего звонка на SaveChanges.

...