2012-08-22 24 views
8

我使用EF 5与Code First。我有一个班,我总是渴望加载一些属性。我删除了虚拟关键字,但它不是急于负载:通过关闭延迟加载,它不会自动贪婪加载正确的EF代码第一次迫使迫切加载

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

所以呢?如果是这样,我如何在不使用Include()的情况下将其归档?

谢谢!

回答

18

不,通过删除关键字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

+0

感谢您的链接,它是非常有用的。我知道包含命令。但是没有办法强制POCO类定义(或映射文件)中的热切加载? – Calvin

+1

不,你想明确告诉EF何时加载数据。如果你不这样做,EF只是包括所有相关的实体,那么就会有主要的性能问题。实质上,每个包含语句都转换为SQL“内部连接”,查询也会选择连接表中的每个列。 – Paul

+0

感谢您的澄清! – Calvin