1、DbContext(上下文类)

  在DbFirst模式中,我们添加一个EDM(Entity Data Model)后会自动生成一个.edmx文件,这个文件中包含一个继承DbContext类的上下文实例,DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:

    1、DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。

    2、DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。

      3、更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。

    4、持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。

  

  从上图可以看出:在EF工作过程中,对实体的操作会导致实体状态的变化,Context根据实体状态的变化生成和执行对应的SQL语句。简言之,对实体的操作给实体添加标签(如Added,Deleted,Modified),DbContext根据实体的标签生成(Insert,Delete,Update)Sql语句,然后EF通过Ado.Net执行Sql实现持久化。

2、DbContext中的DbSet

  DbSet 表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合。 可以使用 DbContext.Set 方法从 DbContext 中创建 DbSet 对象,DbSet对应着数据库中的表,DbSet常用的方法如下

Add(Entity)/AddRange 返回添加的Entity 添加实体到context中,并给实体标记Added状态
dbcontext.Students.Add(studentEntity)
AsNoTracking<Entity> DBQuery<Entity> 获取一个不被context缓冲和追踪的序列,多用于获取只读序列
var studentList = dbcontext.Students.AsNoTracking<Student>().ToList<Student>();
Attach(Entity) 返回添加的Entity 将实体添加到context上下文中
dbcontext.Students.Attach(studentEntity);
Find(int) 返回对应Id的Entity 通过主键获取实体对象,如果在数据库和context中不存在那么返回null,注:也会返回在context中存在但还没有写入数据库的实体对象。
Student studEntity = dbcontext.Students.Find(1);
Include DBQuery include必须是外键连接,且立即执行;join连接不需要外键 ,延时执行
var studentList = dbcontext.Students.Include("StudentAddress").ToList<Student>();
var studentList = dbcontext.Students.Include(s => s.StudentAddress).ToList<Student>();
Remove/RemoveRange 返回删除的entity 删除实例,并给实例对象添加deleted标记。
dbcontext.Students.Remove(studentEntity);
SqlQuery DBSqlQuery 通过sql获取实例集合. 默认情况下,返回的集合被追踪的,可以使用AsNoTracking()取消追踪。
var studentEntity = dbcontext.Students.SqlQuery("select * from student where studentid = 1").FirstOrDefault<Student>();

3.DbContext中的DBEntityEntry

   在EF中实体的五种状态:

    1、detached:实体不在上下文的追踪范围内。如刚new的实例处于detached,可以通过Attach()添加到上下文,此时的状态是unchanged。

    2、unchanged:未改变,如刚从数据库读出来的实例

    3、added:添加状态  一般执行 db.Set<T>.Add(t)/ AddRange(ts)时标记为added。因为新对象在数据库中没有相应的记录,所有不能转成deleted和modified状态。

    4、deleted:删除状态  一般执行 db.Set<T>.Remove(t)/ RemoveRange(ts)时标记为deleted。数据库中必须先有了相应的记录,所有deleted不能转为added状态。

    5、modified:修改状态  改变了实体的属性处于这个状态,可以转为deleted,不能转为added状态。

  当EF从数据库中提取一条记录生成一个实体对象之后,应用程序可以针对它的操作太多了,EF是怎么知道哪个对象处于哪个状态的?

  EF的解决方案是:为当前所有需要跟踪的实体对象,创建一个相应的DbEntityEntry对象,此对象包容着实体对象每个属性的三个值:Current Value、Original Value和Database Value,只要比较这三个值,很容易地就知道哪个属性值被修改了(设置:context.Configuration.AutoDetectChangesEnabled = false则不会去追踪,默认是打开的),从而生成相应的Sql命令。对象的状态会随着操作而改变,我们也可以自己指定状态:

      //为user生成一个DbEntityEntry对象
DbEntityEntry userEntry = context.Entry(user);
userEntry.State = EntityState.Added;//添加标记
userEntry.State = EntityState.Deleted;//删除标记
userEntry.State = EntityState.Modified;//修改标记
userEntry.State = EntityState.Unchanged;//无变化标记
userEntry.State = EntityState.Detached;//不追踪标记

状态间的转化如下图:

  当DbContext执行SaveChanges()方法时,根据实体的状态生成相应的Sql语句,通过Ado.net完成数据的持久化。

EF系列目录链接:Entity Franmework系列教程汇总

Entity Framework入门教程(3)---EF中的上下文简介的更多相关文章

  1. Entity Framework入门教程(4)---EF中的实体关系

    这一节将总结EF是怎么管理实体之间的关系.EF与数据库一样支持三种关系类型:①一对一 ,②一对多,③多对多. 下边是一个SchoolDB数据库的实体数据模型,图中包含所有的实体和各个实体间的关系.通过 ...

  2. Entity Framework入门教程(5)---EF中的持久化场景

    EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...

  3. Entity Framework入门教程(13)---EF中的高并发

    EF中的高并发 这里只介绍EF6中database-first开发方案的高并发解决方案,code-first开发方案中的高并发会在以后的EF CodeFirst系列中介绍. EF默认支持乐观并发:我们 ...

  4. Entity Framework入门教程(19)---EF中使用事务

    EF中使用事务 这节介绍EF6中事务的使用.EF core中事务的使用方式和EF6中一模一样. 1.EF中的默认的事务 默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然 ...

  5. Entity Framework入门教程(7)--- EF中的查询方法

    这里主要介绍两种查询方法 Linq to entity(L2E)和Sql 1.L2E查询 L2E查询时可以使用linq query语法,或者lambda表达式,默认返回的类型是IQueryable,( ...

  6. Entity Framework入门教程(2)---EF工作流程

    EF工作流程 1.EF基本CRUD流程 下边的图就可以很清晰地展示EF的CRUD操作的基本工作流程: 这里做一个EF CRUD操作的简单总结:1.定义模型:这是EF工作的前提,定义模型包括定义领域类( ...

  7. Entity Framework入门教程(6)--- 在线场景中保存数据

    在线场景中保存数据 在线场景中保存实体数据是一项相当容易的任务,因为使用的是同一个context,这个context会自动跟踪所有实体发生的更改. 下图说明了在线场景中的CUD(创建,更新,删除)操作 ...

  8. Entity Framework入门教程(11)---EF6中的异步查询和异步保存

    EF6中的异步查询和异步保存 在.NET4.5中介绍了异步操作,异步操作在EF中也很有用,在EF6中我们可以使用DbContext的实例进行异步查询和异步保存. 1.异步查询 下边是一个通过L2E语法 ...

  9. Entity Framework入门教程(12)--- EF进行批量添加/删除

    EF6添加了批量添加/删除实体集合的方法,我们可以使用DbSet.AddRange()方法将实体集合添加到上下文,同时实体集合中的每一个实体的状态都标记为Added,在执行SaveChange()方法 ...

随机推荐

  1. c/c++ 多线程 std::lock

    多线程 std::lock 当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个.同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...) 额外说明: ...

  2. 利用ZYNQ SOC快速打开算法验证通路(1)——MATLAB浮点数与定点二进制补码互转

    最近本人一直在学习ZYNQ SOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQ PS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更 ...

  3. https协议详解

    HTTPS协议建立过程 1) 客户端首次发送请求时,由于客户端(浏览器等)对一些加解密算法的支持程度不一样,但是在TLS传输中必须使用相同的加解密算法,所以在TLS握手的阶段,客户端告诉服务器端自己支 ...

  4. java反射(java.lang.reflect)---java.lang.reflect.Modifier中状态码

    1. 详情请看jvm(虚拟机)规范 java.lang.reflect.Modifier public static final int ABSTRACT 1024 public static fin ...

  5. 4.13Python数据处理篇之Matplotlib系列(十三)---轴的设置

    目录 目录 前言 (一)设置轴的范围 1.同时对于x,y轴设置 2.分别对与x,y轴的设置 (二)设置刻度的大小 1.普通的刻度设置 2.添加文本的刻度设置 3.主副刻度的设置 (三)设置轴的数据 1 ...

  6. Saltstack_使用指南04_数据系统-Grains

    1. 主机规划 Grains文档 https://docs.saltstack.com/en/latest/topics/grains/index.html 注意事项 修改了master或者minio ...

  7. ASP.NET MVC学习系列(4)——MVC过滤器FilterAttribute

    1.概括 MVC提供的几种过滤器其实也是一种特性(Attribute),MVC支持的过滤器类型有四种,分别是:AuthorizationFilter(授权),ActionFilter(行为),Resu ...

  8. Disruptor-架构思维的转变

    相对于无锁技术,Disruptor对于架构思维的转变,才是其最大亮点. Pub Event 说到RingBuffer做的队列,通常都说的是“一读一写“,或者“多读一写“.而Disruptor天生是为“ ...

  9. R语言学习——实例标识符

    > patientID<-c(1,2,3,4)> age<-c(25,34,28,52)> diabetes<-c("Type1"," ...

  10. Filebeat命令参考

     Filebeat命令参考: Filebeat提供了一个命令行界面,用于启动Filebeat并执行常见任务,例如测试配置文件和加载仪表板.命令行还支持用于控制全局行为的全局标志. 命令: export ...