我有下載了一些STE的通過WCF的客戶端應用程序。如何撤銷對自我追蹤實體所做的所有更改?
使用WPF應用程序,用戶可以選擇從列表框的實體,並通過彈出用戶控件編輯。由於UserControl直接綁定到對象,所以當用戶進行更改時,它當然會影響對象。
我想提供一個取消功能,將撤消到實體所做的所有變化。
有什麼想法?
我有下載了一些STE的通過WCF的客戶端應用程序。如何撤銷對自我追蹤實體所做的所有更改?
使用WPF應用程序,用戶可以選擇從列表框的實體,並通過彈出用戶控件編輯。由於UserControl直接綁定到對象,所以當用戶進行更改時,它當然會影響對象。
我想提供一個取消功能,將撤消到實體所做的所有變化。
有什麼想法?
你可以保持實體的原件。並編輯它的克隆版本。
如果用戶取消您只需繼續使用原副本的變化。
,如果你正在使用EF是一個更好的辦法恢復狀態之後。 – Tocco
我要說,你使用WPF只是綁定PropertyChanged事件節省字典與關鍵屬性名和值的PropertyValue。並通過使用反射
我使用這個解決方案到目前爲止 擴展方法
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();
}
}
}
}
這也是我遵循的方式。這可能是唯一的選擇。因爲STE不記錄所有原始值(如正常EF實體所做的那樣),所以您可以將其設置回原來的值。只有主/外鍵屬性 –
所以,當我要保存新的變化,只是堅持克隆的對象備份線將工作(的ChangeTracker)的初始值字典跟蹤? – mortware
是的。那可行。克隆實體。保持原有的或克隆作爲備份(也無所謂真正的多),當用戶編輯實體時,changetracker會做的工作(通常在數據綁定情況下),你可以通過網絡發送克隆的實體被持久化通過一個objectcontext(.ApplyChanges; .SaveChanges)。當用戶取消它的操作時,您繼續在發生編輯操作之前使用您克隆的實體的備份。 –