【问题标题】:Lazy loading, Deferred Loading and Eager Loading in Entity framework实体框架中的延迟加载、延迟加载和急切加载
【发布时间】:2011-03-14 21:59:59
【问题描述】:

这三种加载方式有什么区别?有人可以举例说明吗?不同的在线资源使用不同的定义,造成不必要的混乱。

【问题讨论】:

    标签: entity-framework orm entity-framework-4


    【解决方案1】:

    查询返回对象时,不会同时加载相关对象。

    当访问导航属性时,它们会自动加载。也称为“延迟加载”,

    【讨论】:

      【解决方案2】:

      延迟/延迟加载:延迟加载和延迟加载是一回事。关系在第一次访问时被加载。这个想法是,如果不需要数据,则不应加载它。

      急切加载:关系与父对象一起获取。这可以更有效地加载数据,但无论正在使用/未使用的数据如何,都会加载数据。

      【讨论】:

        【解决方案3】:

        延迟加载和延迟是同义词(AFAIK,如果我错了,请纠正我)。最大的区别在于 Eager 和 Lazy 之间。 Eager 会预先发生,Lazy 仅在“需要时”发生,执行将发生在 DB 级别——让我们以一个简单的 JOIN 语句为例

        var people = (from p in people SELECT p).ToList();
        var jobs = (from j in jobs SELECT j).ToList();
        
        var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()
        

        这是一个急切加载的示例。我们正在招募所有的人,所有的工作,并且我们正在加入记忆。不是很聪明(通常)。这是 Lazy 风格的样子。

        var people = (from p in people SELECT p);
        var jobs = (from j in jobs SELECT j);
        
        var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()
        

        这样做是为人和工作创建一个 IQueryable(IQueryable 是惰性的),并且连接发生在数据库中。这节省了网络活动,并且通常实际上更快,因为数据库经过优化以进行连接等。

        除非我们明确说“我需要这些数据!” (通过 ToListing 它,迭代它等)它是懒惰的。还有一些怪癖,但这应该是一本不错的入门书。

        【讨论】:

        • 注意 - 语法可能不是 100%,只是随意使用。
        • 根据您的示例,一旦执行 ToList,它就会急切加载,因为它会执行数据库命中以获取数据。因此,它似乎更像是一种编程风格。但是,使用 EF,有一种方法可以在 Context Options 中将 LazyLoading 设置为 true 或 false。这如何适应?
        • EF4 关闭 LazyLoading 将要求您说 People.Include("Jobs") 以带回工作记录(假设工作是对人的 FK)。启用 LazyLoading 后,将在需要时返回该数据。 IE。当你说 People.Jobs.ToList();
        猜你喜欢
        • 2021-10-21
        • 2014-02-18
        • 1970-01-01
        • 2013-03-24
        • 2015-09-30
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多