nhibernate延迟加载选项

27 nhibernate proxy lazy-evaluation

lazy="true"lazy="proxy"nhibernate有什么区别?

fos*_*ndy 23

我怀疑另一种思考方式就是这样.

class Foo
{
   public virtual Bar SingleBar { get; set; }
   public virtual ICollection<Bar> MultiBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  • lazy ="proxy"适用于单个对象(即foo.SingleBar)
  • lazy ="true"适用于对象集合(即foo.MultiBar)

(你不能将lazy ="proxy"设置为集合,也不能将lazy ="true"设置为单个引用.要么会导致NH抛出XmlSchemaException,这对初学者来说有点神秘.)

在操作上,它们执行相同的抽象操作:当且仅当访问属性时,NHibernate才会访问数据库并填充属性.

然而,由于获取对象所需的实现有一些细微差别(在单一情况下,引用的id(Bar)是用父实体(Foo)加载的.在集合的情况下,id是未知的并且必须在另一张表中找到)


Fre*_*els 19

lazy ="proxy"意味着NHibernate将懒惰地初始化你的类的实例; 当NHibernate从数据库中检索您的类的实例时,它将 - 在这种情况下 - 不返回您的类的"真实"实例,但它宁愿为您提供代理.也就是说,它将返回另一个类型的对象,更具体地说,是一个作为类的子类的对象(由NHibernate通过IL生成生成).

您将获得的对象是代理,而唯一的填充属性是Id属性.只要在实例上调用另一个属性,NHibernate就会初始化代理,并从数据库中检索所有其他属性/集合(延迟加载的属性除外).

Lazy ="true"用于另一个级别.而在类级别使用lazy ="proxy",而在集合级别使用lazy ="true".这意味着该集合应该是延迟加载的.


ins*_* me 9

文件引用说,代理属性的值是:

lazy="proxy|no-proxy|false"
Run Code Online (Sandbox Code Playgroud)

lazy(可选 - 默认为代理):默认情况下,单点关联被代理.

lazy ="no-proxy"指定在首次访问实例变量时应该懒惰地获取属性(需要构建时字节码检测).

lazy ="false"指定始终紧急提取关联.