如何防止NHibernate为延迟加载创建DAO代理

时间:2009-07-22 18:34:22

标签: c# .net nhibernate

在我不想延迟加载的域对象中的属性上,我省略了虚拟修饰符,并且还更新了映射文件以反映这一点,例如:

<property name="UserName" column="Name" type="String" length="40" lazy="false"/>

我希望将属性lazy设置为false会使它接受域对象内的相关属性不是虚拟的。

任何人都可以解释为什么我不能让我急切的负载属性虚拟我只想:

public string UserName{
    get{ return _userName; }
    set{ _userName = value; }
}

非常感谢,

安德鲁

3 个答案:

答案 0 :(得分:2)

我不认为属性可以延迟加载 - 只是集合和引用 - 除非最近添加了列的延迟加载。

我不确定lazy="false"对NHibernate中该属性的影响。

答案 1 :(得分:0)

http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/

以下文章非常清楚地解释了原因。谢谢你的意见。欣赏它

答案 2 :(得分:0)

如果您的整个实体处于非懒惰状态,您可以在没有任何虚拟的情况下声明它。这需要在lazy="false"映射上设置<class>

如果您的实体必须支持延迟加载,则必须将其所有非私有成员声明为延迟加载的虚拟成员才能为其构建代理。

当一个实体被延迟加载时,NHibernate只返回一个代理,从中派生,持有它的Id,没有别的。对其他成员的任何访问都将触发其加载。为此,它需要将它们全部虚拟化。

如果你想让属性没有延迟加载,那确实意味着你想要禁用实体的延迟加载,同时可能为它上面的某些属性启用延迟加载。 lazy上的<property>属性就是为此而存在的。这种机制仍然需要代理实体,尽管它不是延迟加载的。我没有检查过这个,但至少延迟加载的属性必须是虚拟的,并且所有其他非私有成员可能仍然需要是虚拟的。
请注意,此类延迟加载当前未进行批处理,因此即使启用batch fetching of lazy loads,也容易受到选择n + 1性能问题的影响。