NHibernate不仅要求您的域的可设置属性是虚拟的,还要求只获取属性和方法。有谁知道这是什么原因?
我无法想象可能的用途。
答案 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代理(即加载数据)的唯一原因就是你有方法不能访问你的类的数据。但在这种情况下,如果此方法不使用您的类的数据,它根本属于该类的什么?