1

次のようなオブジェクト構造があります。

public class Entity
{
    IList<Relationship> Relationships{get;set;}
}

public class Relationship
{
    public Relationship(Entity parent, IList<Entity> children)
    {
    //set properties
    }
    Entity Parent{get;private set;}
    IList<Entity> Children{get;private set;}
}

Relationship には、親インスタンスと子インスタンスに関するすべての情報が含まれています。親と関係を構成するすべての子インスタンスで同じ Relationship インスタンスを共有したいと考えています。

データベースからエンティティをロードするときは、一番上のエンティティから始めて、関係をロードします。構築中の関係をキャッシュして、同じインスタンスを子に再利用できると考えました。しかし、これはすべての子エンティティをロードする必要がある関係を作成するためには機能しません。そのため、各子エンティティは、作成される前に現在子を取得しようとしているのと同じ関係を再作成しようとするため、すべてを作成することになりますリレーションシップをキャッシュに追加する前に、ツリー内で自分の下にあるリレーションシップ インスタンスを確認します。

子供を関係の設定可能なプロパティにせずにこれを回避できる方法はありますか?

4

1 に答える 1

0

そのため、関係を実際に作成せずに関係の親と子を追跡するために使用する RelationshipBuilder クラスを導入することで、これを管理しました。

これにより、関係が子を作成しようとしたときに、関係が既に作成されて返されていることを確認するためにビルダーでチェックしたときに、エンティティを読み込んでビルダーで関係を作成することができました。

つまり、すべてのエンティティ インスタンスを読み込んで、関係に関連付けられた親エンティティと子エンティティを設定しながら、階層をずっと下に移動できました。すべてのエンティティが読み込まれ、再帰が完了し、エンティティの読み込みを開始したエントリ ポイントに戻ったら、リレーションシップ ビルダーにすべてのリレーションシップを解決するように依頼します。これにより、通知された各関係が作成され、その関係に含まれる親インスタンスと子インスタンスに関係インスタンスが設定されます。

于 2011-04-20T07:31:26.213 に答える