Hay dos partes en esto. Los eventos para notificación de cambio son de una sola pieza, pero mantener la historia es otra pieza importante. Entity Framework también lo hace (al igual que LINQ to SQL), y lo he implementado en mi propio código también. Como mínimo, conserve una bandera para que un miembro diga que ha cambiado. Dependiendo de sus requisitos, puede mantener el valor original también. Esto generalmente se convierte en la tarea de un objeto separado. Entity Framework mantiene su seguimiento de cambios en un objeto separado (EntityState, si no recuerdo mal).
En mi propio código, desarrollé una clase "DataMember" que no solo contenía los valores, sino que también guardaba la marca de cambio, el estado nulo y varias otras cosas útiles.Estos DataMembers eran miembros privados en una clase Entity, y la Entidad proporcionaba propiedades que exponían los datos como tipos de datos simples. Los métodos get y set de la propiedad interactuaron con el DataMember para "hacer lo correcto", pero el DataMember sí modificó el seguimiento. Mi clase Entity heredó de una clase "EntityBase" que proporcionó métodos para verificar el cambio a nivel de entidad, aceptar cambios (restablecer indicadores de cambio), etc. Agregar lo siguiente a la notificación de cambio, pero tener una clase DataMember para cada individuo elementos de datos, y una EntityBase para poseer el controlador de eventos de notificación de cambio, simplificará mucho esto.
editar para agregar:
Ahora que estoy en el trabajo, puedo añadir algunos ejemplos de código. Aquí está la definición de interfaz para mi clase 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();
}
aquí es una característica típica de una clase de entidad:
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();
}
}
Tenga en cuenta que el DataMember puede apoyar propiedades como anulable, o no.
código de constructor para añadir un DataMember:
m_Monday = new DataMember<bool>("Monday");
Members.Add(m_Monday);
posible duplicado de [¿Cuál es la mejor manera de saber si se modifica un objeto?] (Http://stackoverflow.com/questions/34809/what- is-the-best-way-to-tell-if-an-object-is-modified) – mathieu