Entity Framework 实体状态
从今天开始我们开始讲解EF中的实体状态和数据操作,这篇文章先讲解实体状态。 我们通过前面的学习,知道EF通过上下位负责跟踪实体的状态,实体状态的位置是在命名空间 System.Dat.Entity 里的 EntityState,具体状态有如下5种:
- Detached
- Unchanged
- Added
- Deleted
- Modified
下面我们分辨来讲解一下
零、Detached
有时候我们只需要实体显示,而不需要实体更新,为了提高性能,我们就就不需要EF上下文对实体进行跟踪,这个时候我们就用到了 Detached 状态。我们只需要在查询的时候使用 AsNoTracking() 来世的查询出来的对象是 Detached 状态。实例代码如下:
var person = db.Person.AsNoTracking().Where(p=>p.Id==1).FirstOrDefault();
注:因为 AsNoTracking 是DbQuery类的方法,因此要首先调用 AsNoTracking 方法。
一、Unchanged
在这个状态下实体被上下文追踪,但是数据库中的值没有发生任何改变。如果实体不存在于数据库,但是该实体要被上下文追踪,同时实体值未发生改变,这个时候就可以通过 Attach 进行附加追踪,然后将实体状态标记为 Unchanged 。 实例代码如下:
using (var db = new EFDbContext())
{
var user =new User()
{
Name = "张三",
Age = 12
}
db.User.Attach(user);
db.Entry(user).State = EntityState.Unchanged;
db.SaveChanges();
}
二、Added
当进行新增操作时就会用到 Added 状态。标记为 Added 状态时,表明尸体上下文被追踪但是不存在于数据库中,当我们调用 SaveChanges 方法时数据将保存进数据库。如果要将实体状态标记为该状态,可以使用两种方法:
1.间接标记,通过 Add 方法调用,示例代码如下:
using (var db = new EFDbContext())
{
var user = new User()
{
Name = "张三"
Age = 12
}
db.User.Add(user);
db.SaveChanges();
}
2.显式标记,通过调用 Entry 方法,示例代码如下:
using (var db = new EFDbContext())
{
var user = new User()
{
Name = "张三"
Age = 12
}
db.Entry(user).State = EntityState.Added;
db.SaveChanges();
}
三、Deleted
如果需要将实体从数据库中删除,可以使用 Deleted 状态,当调用 SaveChanges 方法时数据将会从数据库中删除。和 Added 状态一样,删除实体可以使用两种方法:
1.通过调用 Remove 或者是 RemoveRange 方法,示例代码如下:
using (var db = new EFDbContext())
{
var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
db.User.Remove(user);
db.SaveChanges();
}
注: Remove 用于删除单个实体, RemoveRange 用于删除多个实体。
2.显式标记,通过调用 Entry 方法,示例代码如下:
using (var db = new EFDbContext())
{
var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
db.Entry(user).State = EntityState.Deleted;
db.SaveChanges();
}
四、Modified
当我们修改数据时,需要用到 Modified 状态,当调用 SaveChanges 方法时数据将会修改数据库中的数据。在EF中修改数据,只有一种方法,通过调用 Entry 方法,示例代码如下:
using (var db = new EFDbContext())
{
var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
五、特别提示
所有状态之间几乎都可以通过 Entry(T).State 的方式进行强制状态转换,因为状态改变都是依赖于 Id 的( Added 除外)。我们通过下图来了解一下上面五种状态的相互转换:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php实现微信企业付款到个人零钱功能
- php中对象引用和复制实例分析
- php中上传文件的的解决方案
- PHP实现与java 通信的插件使用教程
- thinkPHP5框架接口写法简单示例
- php实现数组重复数字统计实例
- php提取微信账单的有效信息
- php使用pecl方式安装扩展操作示例
- RSA实现JS前端加密与PHP后端解密功能示例
- Laravel源码解析之路由的使用和示例详解
- Linux中crontab输出重定向不生效问题的解决办法
- PHP swoole和redis异步任务实现方法分析
- thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
- 教你一招实现Linux中的文本比对
- PHP基于swoole多进程操作示例