理解EntityFramework两个核心类型的职责 DbSet和D'bContext
DbSet与DbContext是多对一的关系
DbSet是实体对象的集合,提供了实现CRUD的相应方法
DbContext封装与数据库和数据模型相关的功能,依据数据实体状态创建SQL命令,将数据更改保存到数据库中。

下面开始详细叙述
CRUD功能的核心对象-----DbContext

DbContext三个重要属性:
1.ChangeTracker:DbChangeTracker 负责跟踪数据实体的状态
2.Configuration:DbContextConfiguration控制数据实体对象模型的行为特性和相关参数
3.Database:Database封装一些与数据库相关的功能,比如直接发送sql命令和启动事务
DbSet包容实现CRUD的相关方法

数据实体对象的状态
在程序运行时,数据实体(Data Entity)对象总处于以下状态之一

和Entity一对一关联的另一个类DbEntity<TEnitiy>中有一个属性State:EntityState就引用了数据实体状态的信息,通过获取DbEntity<TEnitiy>对象,就可以知道和它相关联的对象是处于哪种状态


EF数据更新原理
DbContext对象中包含一个ChangeTracker属性,它是一个DbChangeTracker类,

当EF从查询结果中提取数据创建实体类时,它会同步创建另一个对应的DbEntity对象,加入到DbChangeTracker对象的Entries集合中
在需要时,我们可以使用DbContext.Entity(entity)方法获取entity所对应的状态对象,从而了解对象当前所处的状态
实体对象状态的确定


Change Tracker对象通过比对CurrentValues和OriginalVlaues即可确定实体对象状态,并设置DbEntityEntry.State属性为合适的值
在合适的时机,DbContext.ChangeTracker对象检查对象属性值的更改或DbSet对象集合中对象个数的变化,负责同步更新对应的DbEntityEntry对象


SQL命令的生成
在DbContext对象调用SaveChanges()方法时,会在内部调用DbChangeTracker的DetectChanges()方法更新所有实体对象的状态值,接着就可以动态生成SQL语句

AsNoTracking()的影响
使用AsNoTracking()禁用状态跟踪之后,对应的数据实体状态为Detached 。不再允许访问CurrentValues和OriginalValues两个属性(强行访问会抛出InvalidOperationException异常)DbContext.SaveChanges()方法会因为检测不到数据变更不会生成任何的SQL命令发送给数据库

理解EntityFramework两个核心类型的职责 DbSet和D'bContext的更多相关文章
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- JAVA基础之两种核心机制
突然之间需要学习Java,学校里学的东西早就忘记了,得用最短的时间把Java知识理顺,重点还是J2EE,毕竟所有的ava项目中95%都是J2EE,还是先从基础的J2SE学起吧....... 首先是了解 ...
- ASP.NET Web API框架揭秘:路由系统的几个核心类型
ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...
- 自己写一个swap函数交换任意两个相同类型元素的值 对空指针的使用 字节大小的判断(二)了解原理
验证的代码: #include <stdio.h> int main(){ char c = 'z'; ) + (c << ) + () + 'a'; printf(" ...
- Java轻量级业务层框架Spring两大核心IOC和AOP原理
IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...
- C++ : 从栈和堆来理解C#中的值类型和引用类型
C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...
- C#的两种类据类型:值类型和引用类型
注:引用类型相等赋值是地址赋值,不是值赋值. 什么是值类型,什么是引用类型 概念:值类型直接存储其值,而引用类型存储对其值的引用.部署:托管堆上部署了所有引用类型. 引用类型:基类为Objcet 值类 ...
- Java入门到精通——框架篇之Spring源码分析Spring两大核心类
一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...
- Spring 两大核心 IOC 和 AOP
如果你的简历上写着Spring (请详述一下spring的两大核心)这个问题一定会被问到. 一.什么叫IOC 1. IOC 全称(Inversion of Control)-- 控制反转. IOC 只 ...
随机推荐
- 附: K8S入门系列之集群健康检查
Kubernetes的kubectl常用命令 1. pod操作 # 获取所有的pod kubectl get pods --all-namespaces -o wide # 使用yaml文件创建pod ...
- 55.Top K Frequent Elements(出现次数最多的k个元素)
Level: Medium 题目描述: Given a non-empty array of integers, return the k most frequent elements. Exam ...
- DataX简介
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.TableStore(O ...
- 项目部署到IIS后,明明存在某个文件,但是访问却返回404
项目部署到IIS后,明明存在某个文件,但是访问却返回404,这是为什么呢,原因很可能是未添加MIME类型 比如我的文件名是“iconfont.woff” 打开IIS,点击对应的项目,右面展示的是下图 ...
- windows自动关机(任务计划程序 + exe文件)
需求:windows系统自动关机 的需求: 相关工具:win10系统中,使用windows自带的任务计划程序 和 windows自带的关机 exe文件 完成此需求 exe文件位置:C:\Windows ...
- kvm学习笔记(一,基础概念)
前言 阿里云的云主机,采用的kvm,今天就花了点时间研究了下. 一.安装 官方文档参考:http://www.linux-kvm.org/page/HOWTO 二.快速建立一个基于vnc的虚拟机安装 ...
- centos 升级python
1.下载python3.6.1的包 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz 2.解压 tar -zxvf Pytho ...
- Electron-vue实战(二)— 请求Mock数据渲染页面
Electron-vue实战(二)— 请求Mock数据渲染页面 作者:狐狸家的鱼 本文链接 GitHub:sueRimn 一.环境搭建 1.安装Mock.js 如果仅仅用作脱离后台的模拟数据,就安装在 ...
- 使用nano编辑器进行查找和替换
笔者自己常用的是vim.这里nano的使用场景就是刚安装好Ubuntu系统,想要替换更新源,这时候还没装上vim.所以,学一下如何用nano查找和替换,可以解决这个小问题. 首先sudo nano / ...
- php对象方法链式调用编程
E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...