Daniel Fisher (lennybacon.com)

SOA, DATA & THE WEB

Re: Blinder Fleck Change Tracking

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;
    }
}

Comments

Wie sieht denn das INotifyPropertyChanging interface aus?
public interface INotifyPropertyChanging { event PropertyChanging; } Siehe: http://msdn.microsoft.com/de-de/library/system.componentmodel.inotifypropertychanging.aspx
Hallo Daniel, ich sitze seit einiger Zeit daran ChangeTracking sauber im EntityFramework zu implementieren und habe noch keine 100% L&#246;sung gefunden. Dein Ansatz ist ganz nett, aber st&#246;&#223;t sehr schnell an seine Grenzen wenn es sich nicht mehr um simple Propertys (Strings etc.) handelt, sondern um Collections oder Objekte ... dort ist es leider kuam m&#246;glich auf einfachen weg &#19

Write a comment