複数のエンティティのバージョン履歴を追跡して、多対多の関係を含む履歴の任意の時点でのすべてのプロパティの状態を確認できるようにする必要があります。また、変更セットをサポートする必要があります。次の表を考えます。
EntityA
-------
Id
Name
Revision
ChangeId
EntityB
-------
Id
Name
Revision
ChangeId
EntityAToEntityBMapping
-----------------------
EntityAId
EntityBId
ChangeId
ChangeTracking
--------------
ChangeId
Date
User
Description
EntityA および EntityB テーブルの場合、まったく同じ列を持つ履歴テーブルがあります。データは常にオブジェクト モデルを介して変更されるため、変更がコミットされる前に、新しい ChangeTracking エントリを作成し、挿入または更新されるエンティティにその ID を追加し、リビジョンをインクリメントします。次に、EntityA テーブルと EntityB テーブルに Insert/Update トリガーを設定し、以前のデータを履歴テーブルにコピーします。任意の時点で、履歴テーブルにエンティティのすべての履歴があります。
この問題は、多対多のマッピング テーブルで発生します。マッピング テーブルに対して同じことを行い、履歴テーブルを作成することもできますが、「リビジョン 3 では、この EntityA の列にこれらの値があり、EntityB との関係があった」と言うことができる必要があります。EntityA 履歴テーブルは、ChangeId によってマッピング履歴テーブルと結合できますが、EntityA の名前だけを変更するとどうなりますか? その時点で、リレーションシップの履歴は失われます。これは新しいリビジョンであるためです。
サポートが必要な 3 つのシナリオが考えられます。
- EntityA のみが変更され、関係は変更されません。
- EntityA と EntityB の間の関係のみが変更されます。
- EntityA が変更され、その関係が変更されます。
これらすべてについて、一貫性を維持する必要があり、EntityA の特定のリビジョンのすべてのプロパティとすべての関係を常に取得できる必要があります。
多対多のテーブルの履歴を処理する方法を知っていますか? 多くの検索を行った後、この問題に対する満足のいく解決策を見つけることができませんでした。ちなみに、関連する場合に備えて、Entity FrameworkとSQL Serverを使用しています。
ありがとう