4

オブジェクトに加えられたすべての変更を追跡して、ユーザーがデータベース内の任意のアイテムの以前のバージョンを表示およびロールバックできるようにします。

履歴データベース テーブルは次のようになります。

Item     | ItemId | Field     | WhenChanged         | OldValue | NewValue
customer | 6      | LastName  | 2009-12-31 13:00:04 | Sanders  | Sanders-Smith
customer | 5      | FirstName | 2009-12-31 12:11:14 | Jym      | Jim

現在、ユーザーがフォームに入力するたびにこれらの変更を記録するので、オブジェクトの古い状態と新しい状態の完全な情報を取得できます。

ただし、この履歴データのログをcodeから利用できるようにする必要があります。LINQ-to-SQLを使用する場合は透過的に動作する必要があります。つまり、開発者は余分な作業を行う必要はありません。つまり、次のコードは履歴テーブルへの書き込みも発生させる必要があります。

using (var db = Datasource.GetContext())
{
    var customers = from c in db.Customers
        where c.Status == "waiting"
        select c;
    foreach(var customer in customers)
    {
        customer.Status = "finished";
    }
}
db.SubmitChanges();

これを実現するには、次の2 つの方法があると想像できます。

  1. db.SubmitChanges() をオーバーライドしますが、問題は、変更を待っているオブジェクトにアクセスする方法です。
  2. ロギング メソッドをOnSubmitChangesイベントにアタッチしますが、これに対する解決策をまだ見つけることができませんでした

誰かがこの問題に取り組んだことがありますか、それを解決するための良いアプローチを知っていますか?

4

3 に答える 3

2

私は変更の監査について同様の作業をいくつか行いましたが、これが最初のステップです。私のソリューションは、デザイナー コンテキストを抽象化し、そこから実際のコンテキストを導き出し、SubmitChanges をオーバーライドすることで機能します。これは、個別の監査コンテキストと、オブジェクトを取得してそこから監査オブジェクトを構築できるヘルパー クラスと連携して機能します。どのクラスが特定のオブジェクトの監査クラスであるかに関する必要な情報を提供する属性に依存しています。

詳細については、http://farm-fresh-code.blogspot.com の私のブログを参照してください。ここで繰り返すにはあまりにも複雑です。

于 2009-12-16T13:27:56.827 に答える
2

最初の質問では、変更を待っているオブジェクトにアクセスして、db.GetChangeSet()変更されたフィールドと元の値を知ることができます。次を使用できます。

ITable table = db.GetTable(entity.GetType());
ModifiedMemberInfo[] modifiedMembers = table.GetModifiedMembers(entity);
object original = table.GetOriginalEntityState(entity);
于 2009-12-16T13:48:55.900 に答える
1

L2S がコードを生成し、生成されたコードの動作を変更したいので、次の 2 つの可能性が考えられます。

  1. T4 テンプレートを使用して dbml ファイルからコードを生成し、テンプレートを変更して機能を追加します。この方法はここで説明されています
  2. 部分クラスを自分で作成して、生成された (部分) データコンテキスト クラスに機能を追加します。部分クラスでは、作成/更新/削除メソッド (CreateCustomer、UpdateCustomer、および DeleteCustomer) を実装して、変更を保存する機能を追加できます。

これらの指針があなたの役に立つことを願っています。

于 2009-12-16T13:45:59.620 に答える