EF中的上下文(DbContext)简介
DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:
1、DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。
2、DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。
3、更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。
4、持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。

DbContext中的DbSet
DbSet表示上下文中指定类型的所有实体的集合或可从数据库中查询的指定类型的所有实体的集合。

DbSet常用方法
TestDBContext tdb = new TestDBContext();
| Add(Entity)/AddRange |
return添加 的Entity |
添加实体到context中,并给实体标记Added状态 tdb.Persons.Add(entityModel); |
| AsNoTracking<Entity> |
获取一个不被context缓冲和追踪的序列,多用于只读序列 var personList = tdb.Persons.AsNoTracking<Person>().ToList<Person>(); |
|
| Attach(Entity) |
return添加 的Entity |
将实体添加到context上下文中 tdb.Persons.Attach(entityModel); |
| Find(int) |
return对应id 的Entity |
通过主键获取实体对象,如果在数据库和context中不存在那么返回null,注:会返回在context中存在但还没写入数据库的实体对象 Person personEntity = tdb.Persons.Find(1); |
| Include |
include必须是外键连接,且立即执行;join连接不需要外键,延时执行 var personList = tdb.Persons.Include("PersonName").ToList<Person>(); var personList= tdb.Persons.Include(s => s.PersonName).ToList<Person>(); |
|
| Remove/RemoveRange |
retrun删除 的entity |
删除实例,并给实例对象添加deleted标记 tdb.Persons.Remove(EntityModel); |
| SqlQuery |
通过sql获取实例集合,默认返回的集合是被追踪的,可以使用AsNoTracking()取消追踪 var personEntity = tdb.Persons.SqlQuery("select * from T_Person where id = 1").FirstOrDefault<Person>(); |
在EF中实体的五种状态:
1.detached:实体不在上下文的追踪范围内,如刚new的实体,可以通过Attach()添加到上下文,此时状态为unchanged。
2.unchanged:未改变,如刚从数据库读取出来的实体。
3.added:添加状态,一般执行Add/AddRange时标记为added。因为新对象在数据库中没有记录,所以不能转为deleted和modified状态。
4.deleted:删除状态,一般执行Remove/RemoveRange时标记为deleted,不能转换为added状态。
5.modified:修改状态,改变了实体的属性会处于这个状态,能转为deleted状态,不能转换为added状态。
EF如何判断状态
为当前对象(需要追踪的)创建一个DbEntityEntry对象,此对象包含:
Current Value(当前值)/Original Value(原始值)/Database Value(数据库里的值)
只需要比较这三个值,很容易就知道哪些属性被修改了。
设置context.Configuration.AutoDetectChangesEnabled = false则不会去追踪,默认是true。
也可以自己指定状态:

EF中的上下文(DbContext)简介的更多相关文章
- 5.翻译:EF基础系列---EF中的上下文类
原文地址:http://www.entityframeworktutorial.net/basics/context-class-in-entity-framework.aspx EF中的上下文类是一 ...
- Entity Framework入门教程(3)---EF中的上下文简介
1.DbContext(上下文类) 在DbFirst模式中,我们添加一个EDM(Entity Data Model)后会自动生成一个.edmx文件,这个文件中包含一个继承DbContext类的上下文实 ...
- 在EntityFramework6中管理DbContext的正确方式——3环境上下文DbContext vs 显式DbContext vs 注入DbContext(外文翻译)
(译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx EF 6 ...
- 在 ef 中执行 DbContext.Table.AddRange(Enitites).ToList() 会发生什么
在 ef 中执行 DbContext.Table.AddRange(Enitites).ToList() 会发生什么 昨天和朋友摸鱼,无意之间聊到了执行 DbContext.Table.AddRang ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- EF中逆变和协变
EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...
- Entity Framework入门教程(5)---EF中的持久化场景
EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...
随机推荐
- CentOS7安装Python3.6.8
1.首先通过yum安装python可能用到的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel ...
- 剑指offer-面试题4-二维数组中的查找-数组
/* 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. */ /* 解题 ...
- sbt package报错:a bytes-like object is required, not 'str'
Traceback (most recent call last): File , in <module> s.sendall(content) TypeError: a bytes-li ...
- matlab逐行读取text文件,编写函数提取需要的文字
在数学建模中遇到的数据比较难处理,而且给的是text格式,自己想了好长时间才编出来,现在分享一下,可以交流学习 目标的text文件是 只提取里面的数据 需要自编函数 clc,clear path='D ...
- JS DOM属性+JS事件
DOM属性 console.log(ele.attributes) 获取ele元素的属性集合 ele.attributes.getNamesItem(attr).nodeValue 获取指定属性值 e ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
- Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache的类型初始值设定项引发异常。 ---> System.IO.FileLoadException: 未能加载文件或程序集
场景: 安装程序到全新的环境的电脑时中(此时已经安装了能正常安装程序电脑的环境) 完整错误: Application_ThreadException:System.TypeInitialization ...
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
- C#使用OracleBulkCopy
首先使用PL/SQL 通过语句:select * from v$version; 查询出使用的oracle版本,弄到对应版本的Oracle.DataAccess.DLL 我本地使用版本为:11.2. ...
- VsCode开发Java SpringBoot遇到的问题
报错截图 报错一:Build failed, Do you want to continue? 编译失败,你想继续吗? 报错二:ConfigError:The Project "Demo&q ...