Как узнать, изменился ли объект Entity Framework? - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть объект, который называется Uczestnik, который только что был сохранен в базе данных

var konsultant = uczestnik.Konsultanci; 
uczestnik.Konsultanci = null; // null attached object and reuse it's ID later on for SAVE purposes
uczestnik.KonsultantNazwa = konsultant.KonsultantNazwa;
uczestnik.Szkolenie = null; // null attached object and reuse it's ID later on for SAVE purposes
uczestnik.SzkolenieID = szkolenie.SzkolenieID;                       
context.SzkolenieUczestnicies.AddObject(uczestnik);
context.SaveChanges();
context.Detach(uczestnik); // detatch to prevent Context problems
uczestnik.Szkolenie = szkolenie;// reassign for use in ObjectListView
uczestnik.Konsultanci = konsultant; // reassign for use in ObjectListView   

После сохранения он возвращается в ObjectListView, где пользователь решил изменить какое-то значение, и значение было изменено (одно значение из нескольких, чтобы быть точным). Если я проверяю состояние объекта значения, оно находится в неизменном состоянии, поэтому вызовы .Attach и .SaveChanges () ничего не сделают. Я могу использовать ChangeObjectState, но если ничего не изменилось, то нет смысла это делать.

context.SzkolenieUczestnicies.Attach(uczestnik);
//context.ObjectStateManager.ChangeObjectState(uczestnik, EntityState.Modified);
context.SaveChanges();

Как я могу обнаружить изменение и предотвратить ненужный трафик (я могу представить ситуацию, когда ничего не изменилось в объекте, который содержит файлы размером 5 МБ), поэтому resaving это не имеет смысла. Разве сущность не достаточно умна, чтобы обнаружить, что из 15 было изменено только одно поле, и изменить только это поле?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Если сущность отсоединена от контекста, вы не сможете узнать, что изменилось, если вы не перезагружаете исходную сущность из базы данных, не используете самосопровождающие сущности или сами как-то управляете отслеживанием.

Если вы перезагрузите сущность, вы можете использовать ApplyCurrentValues:

var originalEntity = context.MyEntities.Single(e => e.Id == detachedEntity.Id);
context.MyEntities.ApplyCurrentValues(detachedEntity);
context.SaveChanges();

Этот метод помечает свойства как измененные, которые имеют разные значения между исходной и отсоединенной сущностью.SaveChanges создаст инструкцию UPDATE, которая включает только эти измененные свойства.Если ни одно свойство не изменилось, SaveChanges ничего не делает.

Но вы не совсем свободны от «ненужного трафика», поскольку вам нужно загрузить исходный объект, однако вы сохраните ненужный оператор UPDATE.

3 голосов
/ 02 февраля 2012

Если вы Detach сущность, она не отслеживается контекстом. В таком случае вы несете ответственность за обнаружение изменений объекта и информируете контекст об изменениях с помощью ChangeObjectState. Таким образом, вы должны отслеживать, что пользователь изменил или внедрить что-то непосредственно в ваши объекты. Например, реализуйте INotifyPropertyChanged (если вы используете сущности на основе EntityObject, этот интерфейс должен быть уже реализован).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...