【发布时间】:2015-05-19 21:42:30
【问题描述】:
NHibernate 需要将您的实体属性和方法标记为虚拟才能发挥其所有魔力。
虽然我不知道 NHibernate 的内部特性,但可以理解为什么属性必须是虚拟的(那些将通过代理类读取/写入),但是...... 到底为什么我的实体方法也必须是虚拟的?
【问题讨论】:
标签: nhibernate
NHibernate 需要将您的实体属性和方法标记为虚拟才能发挥其所有魔力。
虽然我不知道 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 的代理对象,它将访问未初始化的_a 字段。
为了避免这种情况,为了能够注入代理初始化代码 NHibernate 不需要私有方法是虚拟的。
【讨论】:
<class ... lazy="false" ... >。因此,要么代理虚拟成员 - 要么不代理。 (不讨论什么更好或更合适,只是说:virtual is a mut JUST for a proxy)