2

これらのLinqToSQLの質問のもう1つは、O / R Designerの動作が非常に不可解であるため、どこかでボートに乗り遅れたに違いないと確信しています...

LinqToSQLテーブルの基本クラスがあります。これをと呼びLinqedTableました。私はリフレクションを使用して、子孫クラスのすべてのプロパティを取得し、他の標準的な処理を実行することに成功しました。

ここで、テーブルの自動監査を行いたいので、LinqedTableレコードが挿入または削除されたとき、またはフィールド値が変更されたときはいつでも、変更タイプ、フィールド名、およびその値の詳細を示すレコードを監査テーブルに挿入します。保存前と保存後。

PropertyChangingイベントを使用して、保存する前にすべての変更されたプロパティを追跡し、各SubmitChanges()呼び出しの後に変更のコレクションをクリアすることで、それを実行できると思いました。しかし、O / Rデザイナーから生成されたコードは、奇妙な理由で、イベントのプロパティ名を提供しませんPropertyChanging。空の文字列を送信します。(なぜ?!)イベントでプロパティ名を送信しますPropertyChanged、元の値を取得するにはもう遅すぎます。

部分メソッドを使用してすべてのプロパティの元の値をすべて取得しようと考えましたOnLoaded()が、これは定義上プライベートであり、基本クラスのそのメソッドにアクセスする必要があります。リフレクションを使用してそのメソッドを取得したとしても、それは、テーブルごとに部分メソッドの残りの半分を実装する必要があることを意味します。これは、継承の目的をやや損なうことになります。

また、DataContextで、使用またはオーバーライドするのに適したメソッドが見つかりません。

では、この監査機能を機能させるために何をお勧めしますか?

4

2 に答える 2

7

DataContextでGetChangeSetを使用して、コンテキスト内のすべてのテーブルで発生した更新、挿入、および削除のリストを取得できます。ITable.GetOriginalEntityStateを使用して、変更されたエンティティの元の値を取得できます。ただし、削除または更新されたレコードの元の値を取得する場合、関連付けは使用できないため、関連するエンティティを処理する必要がある場合は、その領域の外部キー値のみに依存する必要があります。ITable.GetModifiedMembersを使用して、変更された値のみを取得できます。

于 2009-05-03T14:22:32.160 に答える
0

おそらくばかげた答えを許してください。しかし、トリガー(SQL Server 2005または2008標準を使用している場合)を使用してSQL Serverで直接監査を実行したり、SQL Server2008Enterpriseの変更追跡機能を使用したりするのはどうでしょうか。

于 2009-05-03T15:02:13.797 に答える