zoukankan      html  css  js  c++  java
  • Entity Framework中的几种加载方式

            在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载。下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表(Catalog)。一个资料属于某一个分类,但是一个分类下可以包含多个资料。是一个一对多的关系。

           两个实体类代码如下:

    public partial class Catalog
    {
        public Catalog()
        {
            this.References = new List<Reference>();
        }
     
        public string CatalogID { get; set; }
        public string CatalogName { get; set; }
        public ICollection<Reference> References { get; set; }
    }
    public partial class Reference
    {
        public string ReferenceID { get; set; }
        public string CatalogID { get; set; }
        public string ReferenceName { get; set; }
        public virtual Catalog Catalog { get; set; }
    }

            1、延迟加载。(如果要使用延迟加载,一是Context中的 this.Configuration.LazyLoadingEnabled =true;另外是要求导航属性前面有virtual关键字,任何条件缺一不可);

    List<Reference> refeList = new List<Reference>();//此时只加载了Reference
     
    refeList = dbContext.Set<Reference>().ToList();
     
    Catalog c = refeList[0].Catalog;//此时会自动生成一条Sql语句,查询这个Referece里面的Catalog,即实现了延迟加载

            2、手动加载,手动加载是在我需要的时候,通过调用Include方法来实现加载的。手动加载不需要任何条件。

    return dbContext.Set<Reference>().Include("Catalog").ToList();
     
    //可以直接传入字段的名称,也可以通过lamaba来传递,但是使用后一种方法的时候,需要添加using System.Data.Entity;引用
    //return dbContext.Set<Reference>().Include(t => t.Catalog).ToList();

           手动加载时,是一次性的加载,只生成一条Sql语句,这条Sql语句是同时查询Reference以及Reference中对应的Catalog 。如果是一对多的关系,有的时候,根本不需要延迟加载,所以一般都把延迟加载关闭掉,在需要使用的时候,通过Include来手动的加载;Include一般适用于一对多的关系时,当读取多的时候,可以手动把一的那个实体加载上。比如读取一个资料时,把这个资料对应的分类实体也读取出来。但是反过来,一般就不用,一般很少会在读取分类时,就把这个分类下的所有资料读取出来,除非是查询的时候。

            3、显式的加载,当我们想在使用的时候,显式的调用去加载,那么我们可以使用Entry中的Collection(List)或者Reference(单个实体)去加载;当我们在读取一个分类的时候,我们可以显示的去加载,每个分类里面的资料。如:

    using (DbContext dbContext = new TestDatabaseContext())
    {
        entityList = dbContext.Set<Catalog>().OrderBy(t=>t.CatalogID).Skip(1).Take(3).ToList();
     
        foreach (Catalog c in entityList)
        {
            dbContext.Entry(c).Collection(t => t.References).Load();//显式加载
        }
     
        return entityList;
    }

    参考资料:

    http://www.cnblogs.com/nianming/p/3494781.html#2861128

    http://www.cnblogs.com/nianming/archive/2013/01/09/2846952.html

  • 相关阅读:
    技术必备:推荐一款接口自动化测试数据校验神器
    提高GUI自动化测试稳定性解决方案
    新特性,推荐一款超强接口管理神器 Apifox
    测试开发:从0到1学习如何测试API网关
    接口自动化测试,一键快速校验接口返回值全部字段
    测试工程师必学:测试人员如何深入了解项目
    Django+Vue+Docker搭建接口测试平台实战
    如何开展线上全链路压测思路分享
    刚转行1年测试新手:学习Python编程经验实战分享
    测开新手:从0到1,自动化测试接入Jenkins学习
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/3551920.html
Copyright © 2011-2022 走看看