Хранить историю значений для определенных свойств объектов EF - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть требование хранить историю значений некоторых полей в приложении EF4 ASP.NET MVC3.Это просто должен быть своего рода файл журнала, регистрирующий пользователя, дату, время, имя таблицы, имя поля, старое значение, новое значение.

Хотя было бы довольно легко закодировать это в различных подпрограммах сохранения, мне интересно,Я могу получить глобальное покрытие, подключив его к какой-либо аннотации данных, так что я могу объявить

[KeepHistory()]
public string Surname { get; set; } 

в своем частичном классе (я использую POCO, но сгенерирован из шаблона T4).

Итак, вопросы

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

2) Можно ли это сделать?Будет ли у меня доступ к нужному контексту для связи с моей единицей работы, чтобы изменения сохранялись или удалялись при сохранении контекста?

3) Есть ли лучший способ?

4)Если вы предложите мне сделать это, любые указатели будут оценены - все, что я прочитал, предназначено для проверки, что, возможно, не лучшая отправная точка.

1 Ответ

2 голосов
/ 24 февраля 2011

На самом деле, проверка может быть хорошей отправной точкой. Поскольку атрибут не знает, какому свойству или классу он был присвоен, но атрибут validation вызывается средой проверки со всей необходимой информацией. Если вы реализуете класс System.ComponentModel.DataAnnotations.ValidationAttribute, вы можете переопределить метод IsValid (object, ValidationContext), который выдает фактическое значение свойства, имя свойства и контейнер.

Это может занять много работы, так как вам нужно добраться до текущего пользователя, вошедшего в систему и т. Д. Я предполагаю, что реализация .NET обеспечивает своего рода кэширование для определенных атрибутов типа сущности, что быть болью, чтобы осуществить самостоятельно.

Другим способом будет использование ObjectStateManager, предоставляемого вашим EF ObjectContext, который может предоставить вам ObjectStateEntry-объекты для всех сущностей данного состояния. Увидеть Метод ObjectStateManager.GetObjectStateEntries (EntityState) для получения дополнительной информации о том, как вызвать его (и когда). ObjectStateEntry фактически содержит запись исходных и текущих значений, которые можно сравнить, чтобы найти любые изменения, сделанные в течение времени существования текущего ObjectContext.

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

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