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。
在 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。