1

クライアントで発生したエンティティに加えられた変更をデータベーステーブルに記録する必要があります。ただし、変更を加えてChangeTrackerプロパティを調べると、変更が発生していないと表示されます。

[サービス]

    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つの追跡はどのように変化しますか?

4

1 に答える 1

1

Riaサービスではなく、WCFのみで動作します(それが大きな違いをもたらすかどうかはわかりません...)。まず、エンティティのStartTrackingにコマンド(サーバー側)を実行する必要はありません。これは、WCFによる逆シリアル化によって自動的に実行されます。

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

次に、変更時にSELF追跡エンティティの主キープロパティと外部キープロパティのみが記録されることを私は知っています。これは、エンティティコンテキストに存在し続けるNORMALエンティティには当てはまりません(その後、すべての変更が記録されます)。

Self-Tracking-Entityを詳しく見ると、次のように表示される場合があります。

    [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. エンティティを更新するときは、最初にデータベースから元の値を取得し、変更を追跡します

お役に立てれば!

于 2011-06-14T14:13:03.227 に答える