2

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

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

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

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

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

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

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

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

я прибег к следующему решению (который, кажется, требует много кода для относительно небольшого требования BTV, изменение модифицированной государственной собственности на 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 »были обнаружены».

Вопросов:

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

Спасибо.

+0

Может кто-нибудь помочь! – wassim

ответ

2

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

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

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

+0

Я больше не использую этот код. Как я уже упоминал в своем вопросе, мне пришлось вручную привязать объект к контексту (который оставляет объект в состоянии «Без изменений»), а затем пометить свойства, которые можно изменить вручную. Спасибо, в любом случае. – wassim

+0

Но точка, которую я пытаюсь сделать, заключается в том, что вы пытаетесь решить проблему без проблем.Вам не нужно вручную отмечать объект/свойства как измененные, потому что EF делает это за вас. – hvd

+0

Моя проблема с поведением, о котором вы говорите, заключается в том, что он позволяет изменять любое свойство. Я не могу разрешить изменение некоторых свойств, поэтому мне нужно убедиться, что только указанный набор свойств будет отмечен как измененный (независимо от того, происходит ли пометка автоматически или вручную, это не проблема. Я решил указать их как измененные вручную, потому что мои усилия «un-flag» свойства только для чтения не сработали!). – wassim

Смежные вопросы