Ich habe gerade Ralfs Posting gelesen. Ich stimme ihm zu (auch wenn ich den DataSet doch etwas kritischer gegenüber stehe:-)), dass Changetracking nicht zum Binden Fleck werden darf.

Den Ansatz das Tracking als seperated concern zu Implementieren habe ich erst vor kurzen gewählt – und da Ralf gefagt hat wer ‘s implementiert möchte ich hier ein paar Zeilen Code teilen. Ich verlasse mich dabei darauf, dass saubere Objekte das Interface INotifyPropertyChanging implementieren. Und nein PostSharp ist auch nicht drinne.

public class ChangeTracker<TEntity>  
    where TEntity : INotifyPropertyChanging  
{  
    private Hashtable _data;  
    private TEntity _entity;  
    private static readonly Type _entityType = typeof(TEntity);  

    public void AddEntity(TEntity entity)  
    {  
        if (entity.EntityState != EntityState.Detached) return;  
        if (_entity != null)  
        {  
            _entity.PropertyChanging -= EntityPropertyChanging;  
        }  
        _data = new Hashtable();  
        _entity = entity;  
        _entity.PropertyChanging += EntityPropertyChanging;  
    }  

    private void EntityPropertyChanging(  
        object sender,  
        PropertyChangingEventArgs e)  
    {  
        if (_data.ContainsKey(e.PropertyName)) return;  
        var propertyInfo = _entityType.GetProperty(e.PropertyName);  
        if (propertyInfo == null) return;  
        if (!propertyInfo.CanWrite) return;  
        var value = propertyInfo.GetValue(_entity, null);  
        _data.Add(e.PropertyName, value);  
    }  

    public void ResetEntity()  
    {  
        _entity.PropertyChanging -= EntityPropertyChanging;  

        foreach (DictionaryEntry data in _data)  
        {  
            var propertyInfo = _entityType.GetProperty((string)data.Key);  
            if (!propertyInfo.CanWrite) continue;  
            propertyInfo.SetValue(_entity, data.Value, null);  
        }  
        _entity = null;  
    }  
    public Hashtable GetChanges()  
    {  
        return _data;  
    }  
}