を使用して状態を復元拡張メソッド
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();
}
}
}
}
これも私が従う方法です。おそらく唯一の選択肢です。なぜなら、STEは元の値(通常のEFエンティティと同じように)を追跡していないからです。元の値の辞書(チェンジトラッカー) –
でプライマリ/外部キーのプロパティのみがトラッキングされるので、新しい変更を保存したいときは、複製されたオブジェクトを保存しておくだけでワイヤーが機能しますか? – mortware
はい。それは動作します。エンティティをクローンします。ユーザーがエンティティを編集したときにオリジナルまたはクローンをバックアップとして保持する(実際には関係ありません)、チェンジトラッカーは作業を行います(一般にデータバインディングのシナリオで)。 objectcontext(.ApplyChanges; .SaveChanges)を使用します。ユーザーが操作を取り消すと、操作を編集する前に複製したエンティティのバックアップを使用して処理を続行します。 –