私は現在、ある時点でオブジェクトと関連する子の正確な状態を取得できるようにする必要があるプロジェクトに取り組んでいます。これを行うために、次のようなモデルを考え出しました。
public class Parent
{
[Key, Column(Order = 0)]
public int Id { get; set; }
[Key, Column(Order = 1)]
public int Version { get; set; }
// Additional properties & version management
}
public class Child
{
[Key, Column(Order = 0)]
public int Id { get; set; }
[Key, Column(Order = 1)]
public int Version { get; set; }
[ForeignKey, Column(Order = 2)]
public int ParentId { get; set;
public virtual Parent Parent { get; set; }
[ForeignKey, Column(Order = 3)]
public int ParentVersion { get; set; }
// Additional properties & version management
}
オブジェクトがあるとしましょう:
Parent 1v1
Child 1v1
Child 2v1
これにより、期待どおり GraphDiff で保存されます。その後、親 1v1 をロードし、何かを変更します。バージョンは 2 に上がり、子オブジェクトのバージョンも 2 に上がります。このオブジェクトは次のようになります。
Parent 1v2
Child 1v2
Child 2v2
また、必要に応じて保存します。これらのオブジェクトごとに新しいレコードが挿入され、古いバージョンが残ります。ただし、子 1 オブジェクトのみを変更すると、上記のモデルから次のようになります。
Parent 1v2
Child 1v3 // We changed something here
Child 2v2
GraphDiff を使用して保存すると、Child 1v2 がグラフに存在しないことがわかり、データベースから削除されます。これを回避する唯一の方法は、2 つの get メソッドを使用することです。実際に使用可能なもの、最大バージョンの親と子をロードするもの、およびすべての履歴オブジェクトを含むグラフ全体をロードするものです。
私はそれをしないほうがいいです。新しい GraphDiff 機能を発表するこのブログ投稿は、いくつかの監査機能が利用できる可能性があることを示しているようですが、これを使用する方法に関するドキュメントは見つかりません。
追加/更新のみのモードで GraphDiff を使用する方法はありますか?