延迟加载

** 默认情况下启用延迟加载。通过创建派生代理类和覆盖虚拟导航 proeprties 来实现延迟加载。第一次访问属性时会发生延迟加载。

int companyId = ...;
Company company = context.Companies
    .First(m => m.Id == companyId);
Person founder = company.Founder; // Founder is loaded
foreach (Address address in company.Addresses)
{
    // Address details are loaded one by one.        
}

要关闭特定导航属性的 Lazy 加载,只需从属性声明中删除 virtual 关键字:

public Person Founder { get; set; } // "virtual" keyword has been removed

如果要完全关闭延迟加载,则必须更改配置,例如,在 Context 构造函数中

public class MyContext : DbContext        
{
    public MyContext(): base("Name=ConnectionString")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
}

注意: 如果你正在使用序列化,请记得关闭延迟加载。因为序列化程序访问每个属性,所以你将从数据库加载所有属性。此外,你可以在导航属性之间进行循环。