为什么在与NHibernate一起使用时,实体类中的所有公共方法都被声明为虚拟?

时间:2010-02-04 08:17:32

标签: c# nhibernate entity

当使用NHibernate使用表映射类时,为什么将实体类方法声明为public virtual。

NHibernate能够在运行时覆盖这些方法的答案是什么?

3 个答案:

答案 0 :(得分:3)

是。 NHibernate会将代理返回给您的对象。在最简单的情况下,这将完全未初始化,并且只知道其类型和ID。因此,NHibernate需要拦截对象的方法调用,并在调用消息体之前对其进行初始化。

答案 1 :(得分:2)

NHibernate默认需要这个,因为它为你的类生成一个代理,以支持实体的延迟加载(不要与关联实体或集合的延迟加载混淆)。 当使用NHibernate的'ISession.Load'方法从DB加载实体时,NHibernate将返回该实体的代理,这意味着它返回一个空实体,其中只设置了主键(标识符)。只有在您实际读取属性后才会检索其他属性的值。

但是,您可以禁用此行为。在NHibernate映射中,您可以指定NHibernate不应该为实体使用动态代理。这很简单,你只需要在类上指定lazy =“false” - 映射:

  

MyEntity.hbm.xml:

<class name="MyEntity" table="MyTable" lazy="false">
</class>

通过这样做,您不必声明虚拟属性或方法。 我大多这样做,因为我不想将属性或方法声明为虚拟,如果我的域模型不需要这样做。我可以忍受不使用动态代理的最小性能影响。

答案 2 :(得分:1)

NHibernate需要虚拟属性才能通过代理类支持延迟加载。