7

私がオンラインで見た例のほとんどは、WinForms/WPF コンテキストでのオブジェクト変更の追跡を示しています。または、Web 上にある場合は、接続されたオブジェクトが使用されるため、各オブジェクトに加えられた変更を追跡できます。

私のシナリオでは、オブジェクトはデータ層を離れると切断されます (WCF のビジネス オブジェクトにマップされ、MVC アプリケーションの DTO にマップされます)。

ユーザーが MVC 上のオブジェクトに変更を加えた場合 (たとえば、1 つのフィールド プロパティを変更するなど)、その変更をビューから DB に送信するにはどうすればよいですか?

特定のオブジェクトに加えられた変更を保存する監査テーブルが必要です。保存したいのは、変更したプロパティのみのオブジェクトの前後の値です

私はこれを行ういくつかの方法を考えることができます

1)MVCレイヤー(またはjavascript?)のすべてのモデルの各プロパティにIsDirtyフラグを実装します。その情報をサービス層、そして最後にデータ層まで伝播します。

2) この変更追跡メカニズムをサービス層内に持つことは素晴らしいことですが、変更された値が MVC から返された後、「元の」値を追跡するにはどうすればよいでしょうか?

3) データベーストリガー? しかし、どうやって始めたらいいのかわからない。これは可能ですか?

n 層 mvc-wcf ソリューション用の既知のオブジェクト変更追跡実装はありますか?

監査テーブルの例:

Audit table

Id              Object         Property         OldValue                NewValue
--------------------------------------------------------------------------------------
1               Customer       Name             Bob                     Joe
2               Customer       Age              21                      22
4

2 に答える 2

3

この問題の可能な解決策は、ユーザーがデータを編集している間にデータベースでどのような変更を許可するかによって大きく異なります。

言い換えれば、データベースを「離れる」と、そのユーザー専用にロックされますか、それともその間に他のユーザーまたはプロセスが更新できますか?

たとえば、ユーザーがデータを取得して数時間または数日間そのままにしておくことができるが、データベースが引き続きデータの更新を許可している場合、現在のバージョンに対してユーザーが行った変更を追跡する必要があります。ユーザーが表示しているデータに加えた変更ではありません。

このシナリオを処理する方法は、トランザクションを開始し、既存のオブジェクト全体を読み取り、リフレクションを使用して古い値と新しい値を比較し、変更を監査ログに記録することです。ネストされたレコードを扱う場合、これは少し複雑になりますが、実装に費やす価値は十分にあります。

一方、他のユーザーまたはプロセスがデータを変更することを許可されていない場合は、複雑さ、データ ストレージ、および既存のデータ構造への影響が異なるいくつかのオプションがあります。

たとえば、各クラスの各プロパティを変更して、いつ変更されたかを記録し、クラスでのこれらの変更の集計を続けることができます (明らかに、基本クラスの実装がここで大いに役立ちます)。

ただし、ユーザーの変更をキャプチャする時点によっては (たとえば、フォームのフィールドを更新するたびに)、かなりの量の役に立たないログ情報が生成される可能性があります。 UI の観点からではなく、データベースの観点から。

オブジェクトをディープ クローンして、それをレイヤーに渡すこともできます。次に、何が変更されたかを判断するときが来たら、再びリフレクションを使用できます。ただし、ビジネス オブジェクトのサイズによっては、完全なコピーをネットワーク経由で移動し、元のレコードと共に保持する必要があるため、この方法ではパフォーマンスが大幅に低下する可能性があります。

「編集中に許可された更新」アプローチと同じアプローチを実装することもできます。私の考えでは、元のデータが編集されたデータと一緒に移動する必要がなく、元のデータが改ざんされる可能性がなく、UI で変更追跡をサポートする必要なく多数のクライアントをサポートするため、これは最もクリーンなソリューションです。レベル。

于 2013-07-22T03:38:42.827 に答える
0

あなたの質問には2つの部分があります:

  1. MVC でそれを行う方法:

通常の方法: 変更をサーバーに送り返したり、コントローラーがそれらを処理したりします。MVC の通常の動作方法の変更を要求するユースケースでは、これは珍しいことではありません。リフレクションを使用して、ユーザーが行った変更を確認する必要がある場合、変更を個々の変更操作としてエンコードするのではなく、変更を個別の変更操作としてエンコードする方が、ユース ケース シナリオに適しています。

  1. データベースでそれを行う方法: これはおそらくあなたの意図した質問です:

まず第一に、ORM フレームワークから離れてください。人生は複雑すぎます。

保存操作の最後のステップでは、次の情報が必要です。

  • 変更が必要なオブジェクトとフィールド、およびそれらの新しい値。

次の情報を追跡する必要があります。

  • データベースで変更しようとしているオブジェクトへの最後の変更。

これは Audit テーブルから取得でき、Session (または Session のようなオブジェクト) に保存する必要があります。

次に、トランザクションで次のことを行う必要があります。

  • 変更されているオブジェクトへの最後の変更をデータベースから取得します。
  • オブジェクトが変更された場合は中断し、ユーザーに衝突を通知します。
  • 変更されているフィールドの現在の値を取得しない場合。
  • 新しい値を保存します。
  • 監査テーブルを更新します。

これにはストアド プロシージャを使用して、プロセスのおしゃべりを減らし、データベース コードとアプリケーション コードの間の懸念事項をより分離します。

于 2013-07-22T04:34:01.890 に答える