Это две части. События для уведомления об изменении - это одна часть, но сохранение истории - еще одна важная вещь. Entity Framework делает это тоже (как LINQ to SQL), и я реализовал это и в своем собственном коде. Как минимум, у вас есть флаг для члена, чтобы сказать, что он изменился. В зависимости от ваших требований вы также можете сохранить исходное значение. Обычно это становится задачей отдельного объекта. Entity Framework сохраняет отслеживание изменений в отдельном объекте (EntityState, если я правильно помню).
В моем собственном коде я разработал класс «DataMember», который не только сохранил значения, но также сохранил флаг изменения, нулевой статус и другие полезные вещи.Эти DataMembers были частными членами класса Entity, а Entity предоставили свойства, которые отображали данные как простые типы данных. Методы get и set свойств взаимодействовали с DataMember, чтобы «сделать правильную вещь», но DataMember выполнил отслеживание изменений. Класс My Entity, унаследованный от класса EntityBase, который предоставляет методы для проверки изменений на уровне сущности, принимает изменения (сбросить флажки изменений) и т. Д. Добавление уведомления об изменении будет следующим, что я делаю, но имея класс DataMember для отдельных элементы данных и EntityBase для управления обработчиком событий уведомления об изменениях, упростит это.
отредактирован ADD:
Теперь, когда я на работе, я могу добавить некоторые примеры кода. Вот определение интерфейса для моего класса DataMember:
public interface IDataMember<T> : IDataMember
{
T Value { get; set; }
T Get();
void Set(T value);
}
public interface IDataMember
{
string FieldName { get; set; }
string OracleName { get; set; }
Type MemberType { get; }
bool HasValue { get; set; }
bool Changed { get; set; }
bool NotNull { get; set; }
bool PrimaryKey { get; set; }
bool AutoIdentity { get; set; }
EntityBase Entity { get; set;}
object GetObjectValue();
void SetNull();
}
Вот типичное свойство в классе сущностей:
private DataMember<bool> m_Monday;
public bool? Monday
{
get
{
if (m_Monday.HasValue)
return m_Monday.Get();
else
return null;
}
set
{
if (value.HasValue)
m_Monday.Set(value.Value);
else
m_Monday.SetNull();
}
}
Обратите внимание, что DataMember может поддерживать свойства, как обнуляемые, или нет.
Конструктор код для добавления DataMember:
m_Monday = new DataMember<bool>("Monday");
Members.Add(m_Monday);
возможный дубликат [Что это лучший способ сказать, если объект изменяется?] (Http://stackoverflow.com/questions/34809/what- is-the-best-way-to-tell-if-an-object-is-modified) – mathieu