NHibernate惰性加载,但没有虚拟属性
本文关键字:虚拟 属性 加载 NHibernate | 更新日期: 2023-09-27 18:23:43
我遇到了一些奇怪的事情。我正在通过代码修改NHibernate 3.2映射,并使用了一个非常简单的对象模型。
我在整个模型中的所有属性都没有标记为虚拟,因为我不想延迟加载。我通过代码进行映射,在每个类映射中,我都设置Lazy(false);
但是,当涉及到映射集合时,如果我在会话结束后尝试访问集合,我会得到一个错误"failed to lazily initialize a collection of role..."
。
我必须显式设置collectionMapping.Lazy(CollectionLazy.NoLazy);
,然后它才会急于加载集合。我的理解是,懒惰加载是不可能的,除非你的模型中的属性是在虚拟机中定义的?
我从根本上错过了什么吗?
virtual
不仅仅用于延迟加载。NHibernate要求它们是virtual
,因为它创建了类的运行时代理并注入行为。
只有惰性关联(多对一或一对一)才需要虚拟属性和方法,因为NHibnerate需要在关联属性上设置代理实体。
集合(一对多和多对多)不需要任何虚拟属性,因为只有集合是惰性的,而不是集合中的实体。NHibernate将始终使用自己的集合类,即使您禁用了延迟加载。
您仍然需要使用IList<T>
而不是List<T>
,因为NH需要自己的集合实现。
考虑:
- 如果没有延迟加载,您在复杂模型中不会走得很远,除非您的数据库适合RAM,或者您不介意将OO模型分割成碎片,这会破坏可维护性和性能
- 当您使用接口从中创建代理时,您可以拥有没有虚拟成员的实体。但是,您应该只使用这些接口来引用实体,因为它们可能总是代理