2011-07-08 16 views
2

私は、WCF経由でいくつかのSTEをダウンロードするクライアントアプリケーションを持っています。セルフトラッキングエンティティに対するすべての変更を元に戻すにはどうすればよいですか?

ユーザーは、WPFアプリケーションを使用して、ListBoxからエンティティを選択し、ポップアップUserControlでエンティティを編集できます。 UserControlはオブジェクトに直接バインドされているため、ユーザーが変更を行ったときにはもちろんそのオブジェクトに影響を与えます。

私はがエンティティに行われすべての変更を取り消します機能をキャンセルし提供したいと思います。

どのような考えですか?

答えて

3

あなたは、エンティティの元のコピーを維持することができます。それを複製したものを編集します。
ユーザーが変更をキャンセルすると、元のコピーをそのまま使用し続けるだけです。

+0

これも私が従う方法です。おそらく唯一の選択肢です。なぜなら、STEは元の値(通常のEFエンティティと同じように)を追跡していないからです。元の値の辞書(チェンジトラッカー) –

+0

でプライマリ/外部キーのプロパティのみがトラッキングされるので、新しい変更を保存したいときは、複製されたオブジェクトを保存しておくだけでワイヤーが機能しますか? – mortware

+1

はい。それは動作します。エンティティをクローンします。ユーザーがエンティティを編集したときにオリジナルまたはクローンをバックアップとして保持する(実際には関係ありません)、チェンジトラッカーは作業を行います(一般にデータバインディングのシナリオで)。 objectcontext(.ApplyChanges; .SaveChanges)を使用します。ユーザーが操作を取り消すと、操作を編集する前に複製したエンティティのバックアップを使用して処理を続行します。 –

3

バインドされたPropertyChangedイベントでWPFを使用するだけで、キーPropertyNameと値PropertyValueを持つディクショナリを保存すると思います。そして、後に これまでのところ、私はこのソリューションを使用してい反射

2

を使用して状態を復元拡張メソッド

using System.Collections.Generic; 
using System.Reflection; 

namespace WpfApplication4 
{ 
    public static class EFExtensions 
    { 
     /// <summary> 
     /// Rejects changes made by user 
     /// </summary> 
     /// <param name="param">Object implementing IObjectWithChangeTracker interface</param> 
     public static void RejectChanges(this IObjectWithChangeTracker param) 
     { 
      OriginalValuesDictionary ovd = param.ChangeTracker.OriginalValues; 
      PropertyInfo[] propertyInfos = (param.GetType()).GetProperties(); 

      foreach (KeyValuePair<string, object> pair in ovd) 
      { 
       foreach (PropertyInfo property in propertyInfos) 
       { 
        if (property.Name == pair.Key && property.CanWrite) 
        { 
         property.SetValue(param, pair.Value, null); 
        } 
       } 
      } 
     } 
    } 
} 

あなたがEFを使用している場合は、より良いアプローチの主なコード

using System.Linq; 

namespace WpfApplication4 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      using (var db = new PlatEntities()) 
      { 
       PacketEPD pd = (from epd in db.PacketEPD 
           select epd).First(); 
       pd.ChangeTracker.ChangeTrackingEnabled = true; 
       pd.EDNo = "1"; 
       pd.RejectChanges(); 
      } 
     } 
    } 
} 
関連する問題