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

时间:2011-07-08 21:11:30

标签: c# entity-framework self-tracking-entities

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

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

我想提供取消功能,该功能会撤消对该实体所做的所有更改。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

答案 3 :(得分: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);
                    }
                }
            }
        }
    }
}

主要代码

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