我是NHibernate
的新手 - 而且EntityFramework
,我正在学习它们。我在Lazy
和NH
中都看到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;
}
每个人的意义何在?谢谢你提前。
答案 0 :(得分:5)
延迟加载是ORM(例如EF,NH和Linq2SQL)使用的一种技术,因此不会立即检索层次结构中的相关实体。相反,只有在需要时才会提取相关实体,通常是在“导航到”或取消引用时。
e.g。在班级模型中,您可能会有一个班级Person
,其所拥有的Collection
(例如IEnumerable
)Pets
。
如果您在获取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意味着只有在访问过一次对象时才创建对象的属性。 通过这种方式,您可以实现数千个不使用内存的对象,它们只是引用空对象,直到您使用它们为止。