NHibernate 中的 Lazy 是啥意思

Posted

技术标签:

【中文标题】NHibernate 中的 Lazy 是啥意思【英文标题】:What does Lazy mean in NHibernateNHibernate 中的 Lazy 是什么意思 【发布时间】:2012-03-06 11:17:39 【问题描述】:

我是NHibernate 的新手-也在EntityFramework 中,我正在学习它们。我在NHEF 中都看到了Lazy 关键字,但我无法理解。您如何为一个五岁的孩子解释Lazy?似乎很重要。可以用简单的语言解释一下吗?

更新:

NHibernate 3.2 代码映射中,我们有:

ManyToOne(t => t.SomeProperty, t => t.Lazy(LazyRelation.Proxy));

LazyRelation 有这个静态值:

public abstract class LazyRelation 
    public static LazyRelation Proxy;
    public static LazyRelation NoProxy;
    public static LazyRelation NoLazy;

是什么意思?提前致谢。

【问题讨论】:

【参考方案1】:

延迟加载是 ORM(例如 EF、NH 和 Linq2SQL)使用的一种技术,它不会立即检索层次结构中的相关实体。相反,只有在需要时才会获取相关实体,通常是在它们被“导航到”或取消引用时。

例如在一个类模型中,你可能有一个类Person,它的Collection(例如IEnumerable)是他/她拥有的Pets

如果在获取 Person 时使用延迟加载,则不会同时获取相关的 Pets 集合。这样可以节省数据库和内存资源。

但是,如果 Pets 集合被访问(并且假设 ORM 的 Context / Session 仍然可用),那么 ORM 将根据“需要”去获取 Pets。

将此与急切加载(例如LoadsWith L2SQL 或Include EF)进行比较,其中调用者明确声明将与人员一起获取哪些相关实体。

参见此处:Lazy loading, Deferred Loading and Eager Loading in Entity framework

重新更新 Ayende 解释了为什么要使用无代理延迟加载(相对于代理延迟加载)here。 NoLazy 禁用延迟加载(即急切加载)

您可以阅读更多关于 implement lazy loading on Wiki 所用技术的信息。 NH 的代理模式实现在讨论here

【讨论】:

【参考方案2】:

懒惰意味着它只在对象被访问一次时创建它的属性。 通过这种方式,您可以实例化数千个不使用内存的对象,它们只是对空对象的引用,直到您使用它们为止。

【讨论】:

以上是关于NHibernate 中的 Lazy 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

这个错误在 nhibernate 中是啥意思

NHibernate代码监视

越南语M? xác nh?n kh?ng ?úng.是啥意思?

NHibernate 和 Oracle Lite

NHibernate 2 + Fluent Nhibernate 中等信任

NHibernate 2.1.2 - 如何禁用反射优化器