EF4.1之贪婪加载和延迟加载

默认情况下,EF4.1是只查询到涉及到的数据对象,但是EF4.1支持两种方法进行控制其加载:

1、贪婪加载

2、延迟加载

使用的表还是上次使用的Order 和 OrderDetails两张表来举例说明

1、贪婪加载

看下面一段代码:

                 var orders = from o in db.Orders.Include("OrderDetails")
where o.CustormName == "xiaoxiao"
select o;

我们可以 直接Tostring()输出:下面是输出结果:

EF4.1之贪婪加载和延迟加载

通过查询语句我们可以看出,我们只要是想要查询一次 Order表里面的数据就要对应的将OrderDetail 里面的数据也一起全都查询出来。这样做的效率是非常低的。其实我们也是可以通过自己写sql语句来完成,后面我会讲到关于 T-sql的内容,就是EF支持sql脚本执行的API。

2、延迟加载

EF4.1默认是支持延迟加载,如果我们要是想要禁用掉他可以在 模型构建器里面将其禁用掉:

         public DbEntities()
{
this.Configuration.LazyLoadingEnabled = false;//禁用掉 延迟加载
}

如何实现延迟加载:

    public class Order
{
public int OrderId { set; get; } public string OrderCode { set; get; } public string CustormName { set; get; } public virtual ICollection<OrderDetail> OrderDetails { set; get; }
}

通过virtual关键字来实现延迟加载:那又是怎么实现的呢:当EF访问你的 子实体的时候,会动态生成一个子实体对象,进而覆盖掉子实体对应的属性,这就是为什么标记为 virtual虚拟的原因了。

总结:

贪婪加载:一次将数据全都查询出来,所以在使用的时候一定要注意效率的问题。

延迟加载:非常宽容,当需要的时候才加载数据。

上一篇:【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用


下一篇:swift类、继承、接口