Мы использовали EF STE некоторое время, но наше приложение значительно выросло, и мы решили подать в суд на новый 4.1 DbContext, чтобы мы могли «развить» отдельный бизнес-уровень поверх нашего уровня данных без необходимости использовать разные типы. для этого.
При элементарной оценке способа работы DbContext я столкнулся с небольшой проблемой.
Я привык запрашивать и предварительно загружать необходимые связанные данные, такие как:
return context.Orders.Include("Detail").SingleOrDefault(ord => ord.ID == ID);
А затем отправить возвращенный объект в пользовательский интерфейс для модификации, а при возврате из пользовательского интерфейса сохранить изменения в базе данных.
Из того, что я читал до сих пор, выполнение «сохранения изменений» в DbContext легко выполняется с помощью такого кода:
context.Entry(order).State = EntityState.Modified;
Проблема с этим кодом заключается в том, что он фактически помечает все свойства объекта как измененные, что не разрешено для некоторых свойств в моей модели (бизнес-правило).
Я прибег к следующему решению (которое, кажется, требует большого количества кода для относительно небольшого требования! Кстати, изменение измененного состояния свойства на Unchanged не поддерживается):
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();
Проблема, с которой я сталкиваюсь в этом коде, заключается в том, что оператор «Прикрепить» генерирует исключение, говорящее о каком-то конфликте в свойствах навигации в прикрепленном объекте, даже если вообще ничего не было изменено! (сохранение объекта точно в том виде, в котором он был извлечен из базы данных). Сообщение об ошибке выглядит примерно так: «Обнаружены конфликтующие изменения роли «Подробности» отношения «OrdersDatamodel.FK_Order_Detail».
Вопросы:
- Есть ли более «элегантный» способ предотвращения изменения определенных свойств объекта?
- Кто-нибудь знает, что происходит с исключением, возникающим при присоединении объекта к контексту?
Спасибо.