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

为什么NHibernate要求实体方法是虚拟的?,nhibernate,Nhibernate,NHibernate要求将您的实体属性和方法标记为虚拟,以实现其所有功能 虽然我不知道NHibernate的内部性,但是可以理解为什么属性必须是虚拟的(通过代理类读取/写入),但是为什么我的实体方法也必须是虚拟的?出于同样的原因。如果您的方法不是虚拟的,那么NHibernate将无法初始化代理 只考虑以下代码: public class A { private int _a; public virtual int A { get { return _a; }

NHibernate要求将您的实体属性和方法标记为虚拟,以实现其所有功能


虽然我不知道NHibernate的内部性,但是可以理解为什么属性必须是虚拟的(通过代理类读取/写入),但是为什么我的实体方法也必须是虚拟的?

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

只考虑以下代码:

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

   public void DoSomethingWithA() 
   {
       Console.WriteLine(_a);
   }
}
因此,如果在调用
a.DoSomethingWithA()时有一个代理对象
a
它将访问未初始化的
字段


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

正确。更重要的是,如果我们不想“NHibernate…发挥它所有的魔力”——我们可以使任何属性或方法非虚拟化——那么我们必须更改映射
。因此,要么是具有虚拟成员的代理,要么不是。(没有讨论什么更好或更合适,只是说:virtual是一个仅用于代理的mut)