Некоторое время мы использовали 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 ».»
Вопросы:
- Существует ли более "элегантный" способ предотвращения изменения определенных свойств объекта?
- Кто-нибудь знает, что происходит с исключением, возникающим при присоединении объекта к контексту?
Спасибо.