Как я могу узнать, когда объект самоконтроля был изменен? - PullRequest
0 голосов
/ 12 июля 2011

Я работал с Entity Framework + сущностями самообследования и обнаружил проблему:

Есть ли способ определить, когда объект был изменен ??

Например: если у вас есть сущность Пользователь с двумя полями: Имя и Пароль, вы можете узнать, был ли изменен экземпляр пользователя, сделав:

<user>.ChangeTracker.State != ObjectState.Unchanged;

Моя проблема в том, что Пользователь имеет Персона , и у этого человека есть поле Электронная почта. Я хочу, чтобы при изменении поля электронной почты соответствующий Пользователь тоже был изменен.

Я пытался использовать такие методы, как: <user>.StartTrackingAll();, но это не работает со свойствами навигации (или, возможно, я делаю что-то не так). Некоторая помощь по этому поводу может быть найдена здесь .

Помните, что объекты самообследования генерируются автоматически с помощью шаблонов T4, поэтому предложения не могут быть изменены.

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Если вы измените адрес электронной почты в экземпляре Person, только этот экземпляр будет правильно помечен как измененный. Это абсолютно правильное поведение. Что вы ожидаете? Ожидаете ли вы, что изменение свойства в связанном объекте будет распространять измененное состояние на отношения? Это сделало бы STE совершенно бесполезными, потому что любое отдельное изменение в графе сущностей привело бы к изменению всех сущностей в графе, и каждая эта модификация приводила к дополнительному обращению в базу данных.

Если вы хотите установить User как измененный при смене электронной почты, просто создайте какой-либо метод или обработайте какое-либо событие и вызовите person.User.MarkAsModified()

0 голосов
/ 13 июля 2011

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

Помните, что объекты самообследования автоматически генерируются с помощью шаблонов T4, поэтому предложенияне может быть изменено.

Не верно.Прежде всего, вы можете изменить шаблон T4, чтобы генерировать более (сложный) код для достижения желаемых результатов.И, во-вторых, он генерирует частичные классы, которые можно легко расширить с помощью пользовательского (не сгенерированного) кода.

...