Lazy在NHibernate中意味着什么

时间:2012-03-06 11:17:40

标签: entity-framework nhibernate orm lazy-loading lazy-evaluation

我是NHibernate的新手 - 而且EntityFramework,我正在学习它们。我在LazyNH中都看到EF关键字,但我无法理解。您如何解释五年前的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;
}

每个人的意义何在?谢谢你提前。

2 个答案:

答案 0 :(得分:5)

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

e.g。在班级模型中,您可能会有一个班级Person,其所拥有的Collection(例如IEnumerablePets

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

但是,如果访问了Pets系列(并且假设ORM的上下文/会话仍然可用),则ORM将根据“需要”进入并获取宠物。

将此与Eager加载(例如LoadsWith L2SQL或Include EF)进行比较,其中调用者明确说明将与Person一起提取哪些相关实体。

另见:Lazy loading, Deferred Loading and Eager Loading in Entity framework

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

您可以阅读有关implement lazy loading on Wiki使用的技巧的更多信息。 讨论了NH的代理模式实现here

答案 1 :(得分:2)

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