NHibernate延迟加载但没有虚拟属性?

时间:2012-02-07 14:09:55

标签: c# nhibernate lazy-loading

我正在经历一些奇怪的事情。我正在通过代码修改NHibernate 3.2映射,并且有一个非常简单的对象模型,我只是用来玩。

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

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

我必须在急切加载集合之前明确设置collectionMapping.Lazy(CollectionLazy.NoLazy);。我的理解是,除非您的模型中的属性是在virtuals中定义的,否则无法进行延迟加载?

我是否从根本上错过了什么?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

只有延迟关联(多对一或一对一)才需要虚拟属性和方法,因为NHibnerate需要在关联属性上设置代理实体

集合(一对多和多对多)不需要任何虚拟属性,因为只有集合是惰性的,而不是集合中的实体。即使禁用延迟加载,NHibernate也总是使用自己的集合类。

答案 2 :(得分:1)

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

考虑:

  • 在没有延迟加载的情况下,你不会在一个复杂的模型中走得很远,除非你的数据库适合RAM,或者你不介意将OO模型切割成破坏可维护性和性能的部分。
  • 当您使用接口创建代理时,您可以拥有没有虚拟成员的实体。但是,您应该只使用这些接口来引用实体,因为它们始终可以是代理。