0

流暢なマッピングでNHibernate3.2を使用しています。以下は、高度にスケーラブルなパフォーマンスに敏感なシステムでの単純な1対多のマッピングです。

    public class Root
    {
        public Root()
        {
            Childs = new List<Child>();
        }
        public virtual int ID { get; set; }
        public virtual IList<Child> Childs { get; set; }
        public virtual int LastChildID { get; set; }
        public virtual int CurrentChildID { get; set; }
    }

    public class Child
    {
        public virtual int ID { get; set; }
        public virtual Root Root { get; set; }
        public virtual string Name { get; set; }
    }

ほとんどすべての場合、これをリポジトリからロードすると、CurrentChildIDで定義されたCurrent Childにのみ関心があり、データベースからの1回のヒットで、ルートとともにこれを読み取りますが、他のChildレコードは読み取りません。その後、残りの子に関心がある場合は、LastChildIDとCurrentChildIDの間のレコードをロードするだけで済みます。これは、ルートに数百の子があり、LastChildIDが処理されるアーカイブ/データウェアハウスのマークが付けられる前のすべてのものがあるためです。別途。

NHibernateでプリフェッチを構成するにはどうすればよいですか。例を見つけることができません。

4

1 に答える 1

0

私はクラスを変更し、getter と setter を実装して、3 つのプロパティすべての追加と削除に一貫性を持たせます。

public class Root
{
    public Root()
    {
        Childs = new List<Child>();
        LastChilds = new List<Child>();
    }

    public virtual int ID { get; set; }
    public virtual IList<Child> AllChilds { get; private set; }
    public virtual IList<Child> ActiveChilds { get; private set; }
    public virtual Child CurrentChild { get; set; }
}

それから

public class RootMap : ClassMap<Root>
{
    public RootMap()
    {

        HasMany(r => r.AllChilds);

        HasMany(r => r.ActiveChilds)
            .Where("archived = false"); // the childs know if they are archived otherwise it will get more complex

        References(r => r.CurrentChild, "LastChildID")
            .Not.LazyLoad();
    }
}
于 2012-02-16T08:48:58.340 に答える