0

asp.net MVC アプリケーションに楽観的ロックを実装し、監査追跡を提供しようとしています。

監査フレームワークは、SubmitChanges 中に DataContext.GetModifiedMembers を呼び出せることに依存していますが、これは理にかなっていると思います。

楽観的ロックでは、ROWVERSION タイムスタンプが使用され、base64 にシリアル化され、ビューの非表示フィールドに配置されます。

私の編集アクションは次のようになります。

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(MyType myType)
{ 
   context.MyTypes.Attach(myType, true);
   context.SubmitChanges(ConflictMode.FailOnFirstConflict);
}

これを行うと、DataContext.GetModifiedMembers は、データベースと提供された値の間で変更されたものだけでなく、MyType のすべてのプロパティを常に返すため、監査が中断されます。具体的には、すべてのプロパティが新しい値から新しい値に変更されたものとして返されるため、リストに対して巧妙なことを行うことはできません。

アタッチする前に最初にオブジェクトをロードしようとしましたが、これにより重複キーの例外が発生します。

次に、UpdateModel を使用してみました。

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(int id, FormCollection col)
{ 
   var mt = context.MyTypes.Single( mt =>  mt.id = id);
   UpdateModel(mt);
   context.SubmitChanges(ConflictMode.FailOnFirstConflict);
}

これは監査で機能しますが、楽観的ロックは失敗します。ChangeConflictException ではなく、InvalidOperationException を取得します。これは、UpdateModel が concurrentTS フィールド (明らかに読み取り専用) を変更しているためです。

私は何を間違っていますか?

4

1 に答える 1

0

これまでの進行状況は、最後の部分を実行し、InvalidOperationException をキャッチして「メンバー 'ConcurrencyTimestamp' の値」というテキストを探し、それを ChangeConflictException として再スローすることで構成されています。

それはうまくいくように見えますが、きれいではありません。

于 2009-05-13T21:07:37.813 に答える