SetFetchMode Lazy 不会覆盖 ClassMap 设置

SetFetchMode Lazy doesn't overwrite ClassMap settings

Criteria 中,我按照 Lazy 执行 SetFetchMode,但仍然获取所有项目,我该如何解决这个问题?

public class MenuItem : BaseClass<MenuItem>
{
    public virtual int MenuItemId { get; set; }
    public virtual string Text { get; set; }
    public virtual IList<MenuItem> Children { get; set; }
    public virtual MenuItem Parent { get; set; }

    public MenuItem()
    {
         Children = new List<MenuItem>();
    }
}

class MenuItemMap : ClassMap<MenuItem>
{
    public MenuItemMap()
    {
        Id(x => x.MenuItemId);
        Map(x => x.Text);
        HasMany(x => x.Children).KeyColumn("ParentId").Not.LazyLoad().Fetch.Select();
        References(x => x.Parent).Not.LazyLoad().Fetch.Select(); 
    }
}

using (var session = NHibernateHelper<T>.OpenSession())
{
    var CC = session.CreateCriteria(typeof(T));

    CC.SetFetchMode("Children", FetchMode.Lazy);

    return CC.List<T>();
}

我不得不说,这是不可能的。我们的 JAVA 兄弟 Hibernate (从中将 NHibernate 移植到 .NET) 似乎有那个选项:

  • Hibernate: Enabling lazy fetching in Criteria API

但是 NHibernate 不支持。赤也.

我们能做的,就是投注Projections。这样我们真的 assemble 恰好一个 SQL 语句并得到一个转换对象列表(半填充,取决于所选属性的数量)

16.6. Projections

Here is如何构建深度投影的示例(包括References/many-to-one)
Here is 如何将它们转换为最初映射的对象 Graph。