【问题标题】:EF Code First forced eager loadingEF Code First 强制急切加载
【发布时间】:2012-08-17 09:23:43
【问题描述】:

我正在使用带有 Code First 的 EF 5。我有一个类,我想总是渴望加载一些属性。我删除了 virtual 关键字,但它不是急切加载:

public class Person
{
   public ICollection<Email> Emails { get; set; } 
   public Profile Profile {get;set;}
}

所以通过关闭延迟加载,它不会自动急切加载,对吧?如果是这样,我如何在不使用 Include() 的情况下将其归档?

谢谢!

【问题讨论】:

    标签: entity-framework ef-code-first code-first


    【解决方案1】:

    不,通过删除 virtual 关键字来关闭延迟加载不会自动启用即时加载。你必须 Include 相关的 EntityCollection 像这样:

    var personWithProfile = ctx.People.Include(x => x.Profile).First();
    var personWithProfileAndEmails = ctx.People.
                                               .Include(x => x.Profile)
                                               .Include(x => x.Emails)
                                               .First();
    

    这是来自 ADO.NET 团队博客的精彩读物:http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

    【讨论】:

    • 感谢您的链接,它非常有用。我知道 Include 命令。但是没有办法强制在 POCO 类定义(或映射文件)中进行预先加载,对吧?
    • 不,您想明确告诉 EF 何时急切加载数据。如果您不这样做并且 EF 仅包含所有相关实体,则会出现重大的性能问题。本质上,每个包含语句都会转换为 SQL inner join,并且查询也会选择连接表中的每一列。
    • 感谢您的澄清!
    • 更新的链接是msdn.microsoft.com/en-US/data/jj574232 - 这有助于指出带有 lambda 参数的 Include 是 System.Data.Entity 命名空间中的扩展方法,因此请确保您使用的是该命名空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多