我有一个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属性,最好如何实现?
答案 0 :(得分:1)
我对属性绑定与hbm / fluent不是很熟悉,但我相信你已经解决了自己的问题!
你是正确的,假设由于包是懒惰的,因此在请求之前不会加载Type2s的数据。你的第二个标准的fetchmode迫使那些物体同时被水合,即。在一个数据库中往返。
顺便说一下,FetchMode.Join等同于FetchMode.Eager(在我看来这是一个更好的名字:laziness)。
描述FetchMode.Join
和FetchMode.Eager
:
http://bchavez.bitarmory.com/archive/2008/04/04/differences-between-nhibernate-fetchmode.eager-and-fetchmode.join.aspx