Как отслеживать изменения сущностей с помощью WCF Ria Services? - PullRequest
1 голос
/ 13 июня 2011

Мне нужно регистрировать изменения, внесенные в объект, которые происходят на клиенте, в таблицу базы данных. Однако, когда я делаю изменения и проверяю свойство ChangeTracker, он утверждает, что никаких изменений не произошло.

[Service]

    private static readonly ISomeDao someDao = DataAccess.SomeDao;
    [Query]
    public List<SomeEntity> GetSomeEntites(int someId)
    {
        var entities = someDao.GetSomeEntites(someId);
        entities.ForEach(e => e.StartTracking());
        return entities;
    }

    [Update]
    public void UpdateSomeEntity(SomeEntity entity)
    {
        // inspect entity.ChangeTracker.OriginalValues.... nothing
        entity.StopTracking();
        // inspect entity.ChangeTracker.OriginalValues.... nothing
        ...
        // Update log table 
    }

[Клиент]

    public EntitySet<SomeEntity> SomeEntities
    {
        get { return _someEntity; }
        set
        {
            if (_someEntity!= value)
            {
                _someEntity= value;
                OnPropertyChanged("SomeEntities");
            }
        }
    }

Итак, если сущности с самообследованием и службы WCF Ria не могут жить вместе (что я и подозреваю), как меняется один трек?

1 Ответ

1 голос
/ 14 июня 2011

Не работает со службами Ria, а исключительно с WCF (не знаю, имеет ли это большое значение ...). Прежде всего вам не нужно выполнять команду (на стороне сервера) для запуска отслеживания сущностей, это делается автоматически с десериализацией WCF.

[OnDeserialized]
public void OnDeserializedMethod(StreamingContext context)
{
  IsDeserializing = false;
  ChangeTracker.ChangeTrackingEnabled = true;
}

Второе, что мне известно, это то, что только свойства первичного и внешнего ключа объекта отслеживания SELF записываются при изменении. это не относится к НОРМАЛЬНЫМ сущностям, которые продолжают жить в контексте сущности (тогда все изменения записываются).

Если вы посмотрите на Само-отслеживающуюся сущность поближе, вы можете увидеть что-то вроде этого:

    [DataMember]
    public string Plaats
    {
        get { return _plaats; }
        set
        {
            if (_plaats != value)
            {
                _plaats = value;
                OnPropertyChanged("Plaats");
            }
        }
    }
    private string _plaats;

    [DataMember]
    public int LandID
    {
        get { return _landID; }
        set
        {
            if (_landID != value)
            {
                ChangeTracker.RecordOriginalValue("LandID", _landID);
                if (!IsDeserializing)
                {
                    if (Land != null && Land.ID != value)
                    {
                        Land = null;
                    }
                }
                _landID = value;
                OnPropertyChanged("LandID");
            }
        }
    }
    private int _landID;

Вы видите разницу? между простым свойством Plaats и внешним ключом собственности LandID? Он находится в строке `ChangeTracker.RecordOriginalValue (" LandID ", _landID);

Для простых свойств эти изменения не записываются (свойства themseklves отклоняются от курса, поэтому контекст EF знает, как применять ApplyChanges и обновлять базу данных).

Возможные идеи:

  1. Чтобы настроить шаблон T4 для записи исходных значений для каждого свойства
  2. Чтобы вывести все сущности из базового класса, в котором можно было бы установить некоторую платформу для записи исходных значений, отвечая на события propertyChanged
  3. При обновлении объектов сначала получите исходные значения из базы данных и отследите изменения

Надеюсь, это поможет!

...