如何撤消对自我跟踪实体所做的所有更改?

我有一个客户端应用程序,通过WCF下载一些STE。

使用WPF应用程序,用户可以从ListBox中选择一个实体,并通过弹出的UserControl进行编辑。 由于UserControl直接绑定到对象,当用户进行更改时,它当然会影响对象。

我想提供一个取消function,它将撤消对实体所做的所有更改。

有什么想法吗?

您可以保留该实体的原始副本。 并编辑它的克隆版本。
如果用户取消更改,您只需继续使用原始副本。

我会说当你在绑定的PropertyChanged事件中使用WPF时,保存一个包含KeyName和值PropertyValue的Dictionary。 并通过使用reflection恢复状态

我到目前为止使用此解决方案的扩展方法

using System.Collections.Generic; using System.Reflection; namespace WpfApplication4 { public static class EFExtensions { ///  /// Rejects changes made by user ///  /// Object implementing IObjectWithChangeTracker interface public static void RejectChanges(this IObjectWithChangeTracker param) { OriginalValuesDictionary ovd = param.ChangeTracker.OriginalValues; PropertyInfo[] propertyInfos = (param.GetType()).GetProperties(); foreach (KeyValuePair pair in ovd) { foreach (PropertyInfo property in propertyInfos) { if (property.Name == pair.Key && property.CanWrite) { property.SetValue(param, pair.Value, null); } } } } } } 

主要代码

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