为什么 NHibernate 要求实体方法是虚拟的?

Why NHibernate requires the entities methods to be virtual?

NHibernate 要求将您的实体属性和方法标记为虚拟才能发挥其所有魔力。

虽然我不知道 NHibernate 的内部机制,但可以理解为什么属性必须是虚拟的(这些属性将 read/written 通过代理 class),但是... 为什么我的实体方法也必须是虚拟的?

出于同样的原因。如果您的方法不是虚拟的,那么 NHibernate 将无法初始化代理。

只需考虑以下代码:

public class A 
{
   private int _a;
   public virtual int A 
   { 
     get { return _a; }
     set { _a = value; } 
   }

   public void DoSomethingWithA() 
   {
       Console.WriteLine(_a);
   }
}

因此,如果您有一个 A 的代理对象,当您调用 a.DoSomethingWithA(); 时,它将访问未初始化的 _a 字段。

为了避免这种情况,为了能够注入代理初始化代码,NHibernate 不需要私有方法是虚拟的。