самообследование pocos, как узнать, изменилось ли свойство? - PullRequest
2 голосов
/ 16 ноября 2010

((IObjectWithChangeTracker)user).ChangeTracker.State, кажется, дает мне "без изменений" каждый раз.Когда я вызываю ApplyChanges, все подобрано правильно, но я хотел бы иметь возможность на своем бизнес-уровне определить, изменил ли кто-то определенное свойство, если он это сделал, я хочу выполнить действие.

ОБНОВЛЕНО

Я полагаю, что это связано с тем фактом, что я не всегда сериализую свои сущности, что только затем вызывает отслеживание изменений.Я использую их в сценарии asp.net, где время от времени я буду сохранять их (сериализовать) в состояние сеанса или состояние представления.

ОБНОВЛЕНО

Добавлена ​​дополнительная информацияв ответе внизу этой страницы.

Ответы [ 3 ]

1 голос
/ 16 ноября 2010

Несколько вариантов, каждый со взлетами и падениями:

  • Вы можете сохранить частное «оригинальное» значение для ваших доменных объектов. Заполните их, когда вы получите объект из БД, и тогда вы сможете легко проверить, равно ли каждое поле своему первоначальному значению. Однако на больших объектах это может стать громоздким.

  • Другой вариант заключается в том, чтобы ваш домен реализовывал ICloneable и сохранял глубокую копию исходного объекта на уровне доступа к данным вместе с логикой для его поднятия. Глубокая копия все еще будет изменчивой, поэтому вы должны позаботиться о том, чтобы не изменять ее, и это удваивает ваш объем памяти.

  • Вы можете просто восстановить запись как новый экземпляр и проверить ее поля. Это просто и относительно просто, но требует двух поездок в БД.

  • Наконец, если вы используете ORM, такой как NHibernate, вы обычно можете подключиться к логике, которую он использует, чтобы определить, какие данные изменились. Это лучшее место для проведения аудита и других наблюдательных действий на уровне вашего домена, но для этого требуется использование ORM, который поддерживает это, и у вас будет ограниченная возможность изменять данные.

0 голосов
/ 19 ноября 2010

Чтобы ответить на мой собственный вопрос (я также обновил исходный вопрос ответом), самосопровождающие POCO только «начинают» отслеживать свои собственные изменения, когда они десериализованы в первый раз. Исходное намерение предназначено, например, для сценариев WCF. В моей ситуации я часто использую в ASP.NET вообще не используя сериализацию, поэтому отслеживание изменений никогда не запускается. В большинстве сценариев (в моем случае) мне даже не понадобятся самосопровождающие POCO, как обычные POCO. работал бы просто отлично. Причина в том, что даже при том, что мои сущности покидают область репозитория, который содержит контекст, который их извлек, контекст все еще остается активным в течение всего процесса HTTP-запроса. Поэтому, когда я делаю последующий вызов хранилища для сохранения изменений, контекст все еще знает об объекте, потому что он извлек его для начала (ранее в том же HTTP-запросе). Ситуация, в которой часть самотрекинга становится полезной, заключается в том, что когда я хочу сохранить свою сущность в ViewState или Session, именно здесь десериализация активирует возможность самопроверки, которая теперь потребуется для сохранения изменений в качестве контекста, который будет Задача обновления этого объекта не совпадает с тем, который его извлек (разные HTTP-запросы все вместе).

0 голосов
/ 16 ноября 2010

Вы можете попробовать подключить событие OnPropertyChanged для свойства.

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