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派生),检索和保存实体都通过 ...
随机推荐
- C语言实现读取字符转换为浮点数,不使用scanf函数
c语言读取int或者float数据,我们习惯于使用scanf函数,但是如果不使用scanf函数,该怎么实现呢. 这里就来尝试一下,不使用scanf来读取数据并转换为float类型. 下面的getflo ...
- 剑指offer-面试题40-最下的k个数-快速排序
/* 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. */ /* 思路: 快速排序,找到第k+1大的数,其左边则为最 ...
- Mac下maven安装
1.下载路径:https://maven.apache.org/download.cgi 要想查看历史版本:则点击archives. 点击binaries 就可以下载对应的maven. Binary ...
- 将小账本上传到GitHub
在假期的时候我已经注册好了用户 https://www.cnblogs.com/1234yyf/p/12312072.html 然后我将我的小账本上传到GitHub上面:一步一步跟着就可以上传成功!! ...
- Qt获取当前屏幕大小
1.头文件 #include<QScreen> 2.代码 QScreen *screen = QGuiApplication::primaryScreen (); QRect screen ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- 将IMAGE转为PDF后上传
using iTextSharp.text; using iTextSharp.text.pdf; /// <summary> /// 将IMAGE转为PDF后上传 /// </su ...
- 1-1.初始K8s
术语及原理 Master(主节点:control plane) 集群中的神经中枢网关.负责整个集群的资源管理.Pod调度.弹性伸缩.安全控制.系统监控.纠错等管理功能. ApiServer 集群的网关 ...
- Spring Boot源码(二):SPI去除web.xml
SPI广泛用于dubbo,spring boot,spring cloud alibaba等 关于SPI,可见SPI-Service Provider Interface 继续上篇文章 上面三句代码的 ...
- npm常用模块之chai使用
更多npm常用模块使用请访问:npm常用模块汇总 chai这是一款用于节点和浏览器的BDD / TDD断言库,可以与任何javascript测试框架完美地配对. 更多使用文档请点击访问chai工具官网 ...