如何撤消对自我跟踪实体所做的所有更改
本文关键字:实体 跟踪 自我 何撤消 撤消 | 更新日期: 2023-09-27 18:01:40
我有一个客户端应用程序,它通过WCF下载了许多STE。
使用WPF应用程序,用户可以从列表框中选择一个实体,并通过弹出的UserControl对其进行编辑。由于UserControl直接绑定到对象,当用户进行更改时,它当然会影响对象。
我想提供一个Cancel函数,它将撤销所有对实体所做的更改。
任何想法吗?
您可以保留实体的原始副本。并编辑它的克隆版本。
如果用户取消更改,您只需继续使用原始副本。
我会说,当你使用WPF只是在绑定PropertyChanged事件保存一个字典与键PropertyName和值PropertyValue。在使用反射恢复状态后
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/c12bd8c8-231f-4dcc-a665-b048f7debbd7/
目前我正在使用这个解决方案扩展方法
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);
}
}
}
}
}
}
主代码
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();
}
}
}
}