Ci sono due parti a questo. Gli eventi per la notifica del cambiamento sono un pezzo, ma il mantenimento della storia è un altro tassello importante. Entity Framework fa anche questo (come fa LINQ a SQL) e l'ho implementato anche nel mio codice. Come minimo, si mantiene una bandiera per un membro per dire che è cambiata. A seconda delle tue esigenze, puoi mantenere anche il valore originale. Questo di solito diventa il compito di un oggetto separato. Entity Framework mantiene il rilevamento delle modifiche in un oggetto separato (EntityState, se non ricordo male).
Nel mio codice, ho sviluppato una classe "DataMember" che non solo conteneva i valori, ma manteneva anche il flag di modifica, lo stato null e varie altre cose utili.Questi DataMembers erano membri privati in una classe Entity e le entità fornivano proprietà che esponevano i dati come semplici tipi di dati. La proprietà ottiene e imposta i metodi interagiti con DataMember per "fare la cosa giusta", ma DataMember ha modificato il tracciamento. La mia classe Entity è stata ereditata da una classe "EntityBase" che ha fornito metodi per verificare la modifica a livello di entità, accettare modifiche (reimpostare i flag di modifica), ecc. Aggiungere una notifica di modifica sarà la prossima cosa che faccio, ma avere una classe DataMember per singoli elementi di dati, e un EntityBase per possedere il gestore di eventi di notifica delle modifiche, semplificherà molto questo.
A cura di aggiungere:
Ora che sono al lavoro, posso aggiungere alcuni esempi di codice. Ecco la definizione di interfaccia per la mia classe 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();
}
Ecco una proprietà tipica in una classe di entità:
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();
}
}
Si noti che il DataMember in grado di supportare le proprietà come annullabile, oppure no.
codice del costruttore per aggiungere un DataMember:
m_Monday = new DataMember<bool>("Monday");
Members.Add(m_Monday);
fonte
2010-01-15 13:02:39
possibile duplicato di [Qual è il modo migliore per dire se un oggetto viene modificato?] (Http://stackoverflow.com/questions/34809/what- is-the-best-way-to-tell-if-an-object-is-modified) – mathieu