我正在经历一些奇怪的事情。我正在通过代码修改NHibernate 3.2映射,并且有一个非常简单的对象模型,我只是用来玩。
整个模型中的所有属性都没有标记为虚拟,因为我不想延迟加载。我按代码映射,并在每个类映射中设置Lazy(false);
但是,当涉及映射集合时,如果我在会话结束后尝试访问集合,则会收到错误"failed to lazily initialize a collection of role..."
。
我必须在急切加载集合之前明确设置collectionMapping.Lazy(CollectionLazy.NoLazy);
。我的理解是,除非您的模型中的属性是在virtuals中定义的,否则无法进行延迟加载?
我是否从根本上错过了什么?
答案 0 :(得分:7)
virtual
不仅仅是延迟加载。 NHibernate要求它们为virtual
,因为它会创建类的运行时代理并注入行为。
答案 1 :(得分:2)
只有延迟关联(多对一或一对一)才需要虚拟属性和方法,因为NHibnerate需要在关联属性上设置代理实体。
集合(一对多和多对多)不需要任何虚拟属性,因为只有集合是惰性的,而不是集合中的实体。即使禁用延迟加载,NHibernate也总是使用自己的集合类。
答案 2 :(得分:1)
您仍然需要使用IList<T>
而不是List<T>
,因为NH需要自己的集合实现。
考虑: