Nhibernate智能预取在1到多个场景中

时间:2012-02-15 21:10:05

标签: nhibernate one-to-many fluent one-to-one prefetch

我们正在使用NHibernate 3.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定义的当前子进程感兴趣,并且希望在数据库的一次命中中读取此内容以及根但没有其他子记录。如果我们对其余的孩子感兴趣,我们只需要在LastChildID和CurrentChildID之间加载记录 - 原因是我们可能有数百个子项用于root,并且LastChildID之前的所有内容都将被标记为归档/ datawarehousing seperately。

我们如何在NHibernate中配置预取。我们只是找不到一个例子。

1 个答案:

答案 0 :(得分:0)

我会更改类并实现getter和setter以使它们在所有三个属性中添加和删除一致

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();
    }
}