理解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 只 ...
随机推荐
- vue证明题二,让vue跑起来
使用vue有很多连带产品,大多数入门的并非看不懂官方文档,也并非不会语法,而是卡在这些连带产品上 笔者刚刚入手这台电脑,什么都没装,就以此开始,从头构建一个vue项目吧,哪怕没有任何基础,跟着来应该是 ...
- js转换成字符串
有两种方法: 1.对于boolean, number, string类型,可调用toString()方法 2.用String(var)方法 其中,第二种方法使用范围更广,可将没有toString()方 ...
- 使用extract-text-webpack-plugin处理css文件路径问题
首先看到我们的文件夹目录如下: webpack.config.js //解析分离cssconst ExtractTextPlugin = require('extract-text-webpack-p ...
- 配置阿里云SLB全站HTTPS集群
配置阿里云SLB全站HTTPS集群(以下内容仅为流程,信息可能有些对应不上) 1 登录阿里云购买两台实例 1.1 按量付费购买两台实例 1.2 配置网络可以不选择分配外网 1.3 自定义密码 1.4 ...
- [js测试]JavaScript Web Quiz By davidshariff
Question1 var foo = function foo() { console.log(foo === foo); }; foo(); 输出是"true",因为foo就指 ...
- Paint的Gradient的用法(转)
转自:https://www.jianshu.com/p/02b02c1696b2 Paint的Gradient的用法 嗯哼嗯哼嗯哼嗯哼 关注 2017.07.04 15:45* 字数 173 阅读 ...
- 转 Tomcat访问日志详细配置
配置http访问日志.Tomcat自带的能够记录的http访问日志已经很详细了取消下面这段的注释: <Valve className="org.apache.catalina.valv ...
- 启动数据库报:ORA-03113
1启动数据库报:ORA-03113 2.查看oracle运行日志 tail -50 //home/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.l ...
- js调用浏览器
定义和用法 open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口. 语法 window.open(URL,name,specs,replace) 参数 说明 URL 可选.打开指定的页面 ...
- shell脚本编写nginx部署脚本
下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-r ...