2

私は現在、ある時点でオブジェクトと関連する子の正確な状態を取得できるようにする必要があるプロジェクトに取り組んでいます。これを行うために、次のようなモデルを考え出しました。

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 を使用する方法はありますか?

4

0 に答える 0