NHibernate标准fetchmode

时间:2010-10-19 12:05:11

标签: nhibernate criteria

我有一个Type1类型,其属性Type2s由List<Type2>组成。我已经为属性配置了NHibernate映射,如下所示:

[Map(0, Table = "Type2s", Schema = "MySchema", Cascade = CascadeStyle.All, Lazy = true, Inverse = true)]
[Key(1, Column = "Type1Id")]
[OneToMany(2, Class = "Type2, MyNamespace")]

检索Type1实例的这两个标准之间的行为有何不同:

var criteria1 = DetachedCriteria.For<MyType1>();

var criteria2 = DetachedCriteria.For<MyType1>().SetFetchMode("Type2s", FetchMode.Join);

当我根据这些条件调用可执行条件的.List时,可能会检索与每个Type1实例关联的Type2的SQL,直到我实际尝试访问该属性,因为该属性被标记为Lazy。这是正确的假设吗?

如果我想强制评估Lazy属性,最好如何实现?

1 个答案:

答案 0 :(得分:1)

我对属性绑定与hbm / fluent不是很熟悉,但我相信你已经解决了自己的问题!

你是正确的,假设由于包是懒惰的,因此在请求之前不会加载Type2s的数据。你的第二个标准的fetchmode迫使那些物体同时被水合,即。在一个数据库中往返。

顺便说一下,FetchMode.Join等同于FetchMode.Eager(在我看来这是一个更好的名字:laziness)。

文章更深入地解释了它: http://davidhayden.com/blog/dave/archive/2008/12/06/ImprovingNHibernatePerformanceFetchingStrategiesFetchModeFluentNHibernate.aspx

描述FetchMode.JoinFetchMode.Eagerhttp://bchavez.bitarmory.com/archive/2008/04/04/differences-between-nhibernate-fetchmode.eager-and-fetchmode.join.aspx