只是阅读有关nHibernate的内容,为什么类属性必须是虚拟的?
背后的原因是什么?
答案 0 :(得分:18)
我建议你阅读Must Everything Be Virtual With NHibernate?
该问题的快速答案是: 因为我们需要成员是虚拟的 为了做我们的延迟加载 魔法/伏都
答案越长越有趣 虽然。任何一个重要的特征 真正的ORM必须具有透明的Lazy 加载。如果您检索对象 通过ORM,你不希望它 自动拉入整个对象 图表(无论如何不是默认),但是你 不想乱丢你的代码 检查是否有某些关联 已加载,然后加载 如有必要,他们。这是ORM的 责任。理想情况下,你想要 能够访问属性并拥有 ORM加载必要的数据 首先访问这些属性,如果 尚未检索到数据。
答案 1 :(得分:6)
正如安德鲁所说,属性是虚拟的,可以触发延迟加载。以下是对原因的解释:在运行时,NHibernate会将代理对象替换为您的不动产对象。访问它们后,代理对象知道如何为您获取真实对象。将属性标记为虚拟允许此替换发生。
答案 2 :(得分:0)
如果您未使用上述提到的非虚拟方法,则只需添加以下代码段的SetProperty
:
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().SetProperty(NHibernate.Cfg.Environment.UseProxyValidator, Boolean.FalseString)
这只是关闭了导致错误的验证,请确保您未使用非虚拟方法,因为NHibernate将无法代理它们(如原始错误所建议)。