为什么NHibernate需要不可设置的成员是虚拟的?

时间:2009-09-24 19:31:32

标签: nhibernate

NHibernate不仅要求您的域的可设置属性是虚拟的,还要求只获取属性和方法。有谁知道这是什么原因?

我无法想象可能的用途。

3 个答案:

答案 0 :(得分:8)

原因是延迟加载。为了使延迟加载成为可能,创建了一个代理类。 必须拦截来自“outside”的每个调用,以便在执行实际方法/属性之前加载您的实体。如果某些方法/属性不是虚拟的,则无法拦截这些调用,并且不会加载实体。

答案 1 :(得分:2)

我不是NHibernate的专家,但是从阅读Oren的博客,以及我从NH中学到的东西,基本的使用模式是代理ORM的对象。这意味着,除了其他事项之外,您将能够映射的唯一事物将是虚拟化的事物,否则NH将不得不使用不同的策略来重新定义引擎下的实现。

答案 2 :(得分:2)

因为您可能希望从那里访问您的可设置属性,并且可能以某种花哨的间接或反射方式。因此,我们100%确定在使用您的实体时,它已初始化。 例如:

public string GetSmth 
{
  get
  {
     // NHibernate will not know that you access this field.
     return _name;
  }
}
private string _name;
public virtual string Name { get { return _name; } set { _name = value; } }

以下是Ayende与实体框架相关的解释: http://ayende.com/Blog/archive/2009/05/29/why-defer-loading-in-entity-framework-isnrsquot-going-to-work.aspx

  

AddProduct是一种非虚方法   打电话,所以不能截获。   也可以访问_products字段   不能被截获。

我明白为什么人们想要方法执行而不弄乱NH代理(即加载数据)的唯一原因就是你有方法不能访问你的类的数据。但在这种情况下,如果此方法不使用您的类的数据,它根本属于该类的什么?