2012-02-07 62 views
1

我正在经历一些奇怪的事情。我用代码来修改NHibernate 3.2映射,并且有一个非常简单的对象模型,我只是用来玩。NHibernate惰性加载但没有虚拟属性?

在整个模型中我的属性都没有标记为虚拟的,因为我不想延迟加载。我通过代码映射,并在每个类映射我设置Lazy(false);

但是,当涉及到映射集合,如果我尝试访问会话后会话结束我得到一个错误"failed to lazily initialize a collection of role..."

我必须明确地设置collectionMapping.Lazy(CollectionLazy.NoLazy);,然后才会急于加载集合。我的理解是,除非您的模型中的属性是在虚拟中定义的,否则懒加载是不可能的?

我从根本上错过了什么吗?

+0

推荐阅读:[NHibernate是懒惰的,只是住它](http://ayende.com/blog/4573/nhibernate-is-lazy-just-live-with-it) – 2012-02-08 22:27:12

回答

2

虚拟的属性和方法。

集合(一个一对多和多对多的多),因为只有收集很懒,不是集合中的实体不需要任何虚拟财产。 NHibernate将始终使用自己的集合类,即使您禁用延迟加载。

6

virtual需要的不仅仅是延迟加载。 NHibernate要求它们是virtual,因为它创建了该类的运行时代理并注入行为。

+0

它是如何虽然它本质上是执行延迟加载时,如果我设置'懒惰(true);'它会告诉我将所有属性设置为虚拟? – David 2012-02-07 14:21:23

+1

...但代理仅用于延迟加载。 – 2012-02-07 14:29:32

1

您仍然需要使用IList<T>而不是List<T>,因为NH需要自己的集合实现。

考虑:

  • 你不会得到很远没有延迟加载复杂的模型,除了你的数据库适合RAM或者你不介意砍你OO模型成碎片从而破坏双方可维护性和性能。
  • 当您使用接口从中创建代理时,您可以拥有没有虚拟成员的实体。但是,您应该只使用这些接口来引用实体,因为它们始终可以是代理。只需要懒协会(多到一个或一个对一个),因为NHibnerate需要设置代理实体在关联属性上
+0

有效点,但是我可以延迟加载,而无需将所有属性设置为虚拟。我不认为这在NHibernate中是可能的。 – David 2012-02-07 15:24:34