2


0

データコンテキストを介してロードした、タイプ MyClass`のLinq-to-SQLオブジェクト obj`があります。

フィールドが実際に変更されていなくても、そのオブジェクトを強制的に保存するようにしたいと思います。そうすれば、保存アクションが舞台裏でいくつかのトリガーを引き起こすことができます。

私のデータコンテキストに obj`がダーティだと思わせる最も簡単な方法は何ですか? SubmitChanges() を呼び出すことで obj`が保存されるようになるでしょうか?

2 Answer


7


プロパティをダミー値に変更してから元に戻すだけです。

var value = obj.SomeField; obj.SomeField = "dummy"; obj.SomeField = value; dc.SubmitChanges();

*編集:*それを取り戻しましょう。 L2Sチェンジトラッカーはそれによってだまされることはありません。 既存の列を変更したくない場合、最も簡単で最もクリーンで安全な方法はおそらく新しい列を追加してそれを変更することです。

絶対にデータベースを変更できない場合 新しい列を追加してから、リフレクションを使用してチェンジトラッカーに移動することもできます。 試したことはありませんが、その方法は(おおよそ)次のようになります。

1)datacontextはservicesと呼ばれるプライベートメンバーを持っています。 2)servicesは、プライベートメンバートラッカーと内部メンバーChangeTracker(前者を返す)を持つCommonDataServicesを指します。 3)変更トラッカーには、TrackedObjectを返すGetTrackedObject内部メソッドがあります。 4)TrackedObjectはConvertToModifiedメソッドを持っています…​

*編集#2:*上記のリフレクションルートを試したところ、うまくいったようです。 例えば。:

using(advWorksDataContext dc = new advWorksDataContext()){従業員emp = dc.Employees.FirstOrDefault(); dc.MakeDirty(emp); dc.SubmitChanges(); }

…​and the implementation of MakeDirty is:

パブリック静的クラスDCExtensions {内部静的void MakeDirty(このSystem.Data.Linq.DataContext dc、オブジェクトsomeEntity){// dc型を取得するwhile(dcType!= typeof(System.Data.Linq.DataContext)){dcType = dcType.BaseType; }

// DC内のCommonDataServicesのことを取得します。オブジェクトcommonDataServices = commonDataServicesField.GetValue(dc);タイプcommonDataServicesType = commonDataServices.GetType();

//変更トラッカーを取得しますSystem.Reflection.PropertyInfo changeTrackerProperty = commonDataServicesType.GetProperty( "ChangeTracker"、System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);オブジェクトchangeTracker = changeTrackerProperty.GetValue(commonDataServices、null); type changeTrackerType = changeTracker.GetType();

//追跡オブジェクトメソッドを取得しますSystem.Reflection.MethodInfo getTrackedObjectMethod = changeTrackerType.GetMethod( "GetTrackedObject"、System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);オブジェクトtrackedObject = getTrackedObjectMethod.Invoke(changeTracker、new object [] {someEntity});

// ConvertToModifiedメソッドを取得するType trackedObjectType = trackedObject.GetType(); System.Reflection.MethodInfo convertToModifiedMethod = trackedObjectType.GetMethod( "ConvertToModified"、System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

//変更されたメソッドに変換するconvertToModifiedMethod.Invoke(trackedObject、null); }}


0


それ以外に問題がなければ、2回送信することができますか? したがって、Kristoferの最初の答えの変形を使うことができます。

プロパティをダミー値に変更し、保存してから元に戻すだけです。 var value = obj.SomeField; obj.SomeField = "dummy"; dc.SubmitChanges(); obj.SomeField = value; dc.SubmitChanges();

あなたの目的のために何かいいですか?