Entity Framework应用:根据实体的EntityState状态实现增删改查
在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查。
一、修改数据
上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询出来要修改的数据,然后在修改。但是这种操作会导致多次操作数据库:

从上面的截图中可以看出,查询数据的时候会执行一次事物,修改的时候又执行了一次事物,即修改数据会操作两次数据库。那么有没有什么方法可以只操作一次数据库呢?那就是下面要讲解的EntityState。
使用EntityState优化上面的修改方法:
static void EditAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 将EF执行的SQL语句输出到控制台
dbContext.Database.Log += p => Console.WriteLine(p);
// 创建要修改的对象
Student stu = new Student()
{
StudentID = ,
Age =
};
// 通过上下文获取对象相关信息
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
// 对象的状态是没有修改
entry.State = System.Data.Entity.EntityState.Unchanged;
// 对象的属性值Age修改了
entry.Property("Age").IsModified = true;
// 保存修改 会智能判断哪个对象的哪个属性值修改了
dbContext.SaveChanges();
Console.WriteLine("修改成功");
}
}
结果:

从上面的截图中不难看出,这次只操作了一次数据库。
好处:只执行一次数据库操作,不需要查询了,体现了EF修改的本质(通过实体对象的状态进行修改)。
二、删除
static void DeleteAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 将EF执行的SQL语句输出到控制台
dbContext.Database.Log += p => Console.WriteLine(p);
// 先查询然后在删除
Student stu = new Student()
{
StudentID =
};
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
entry.State = System.Data.Entity.EntityState.Deleted;
// 保存,智能判断对象的状态
dbContext.SaveChanges();
Console.WriteLine("删除成功");
}
}
结果:

三、新增数据
static void AddAdvance()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 定义Student对象
Student stu = new Student()
{
StudentName = "花千骨",
Sex = "女",
Age = ,
Major = "舞蹈专业",
Email = "2345678911@qq.com"
};
// 将EF执行的SQL语句输出到控制台
dbContext.Database.Log += p => Console.WriteLine(p);
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
entry.State = System.Data.Entity.EntityState.Added;
// 保存的数据库
dbContext.SaveChanges();
Console.WriteLine("保存成功");
}
}

四、批处理
利用EntityState可以很好的实现批处理功能,例如下面的例子:增加两条数据,修改一条数据,删除一条数据
static void Save()
{
using (StudentSystemEntities dbContext = new StudentSystemEntities())
{
// 将EF执行的SQL语句输出到控制台
dbContext.Database.Log += p => Console.WriteLine(p);
// 新增数据1
Student stu1 = new Student()
{
StudentName = "红孩儿",
Age = ,
Major = "冶金专业"
};
dbContext.Students.Add(stu1); // 新增数据2
Student stu2 = new Student()
{
StudentName = "青牛精",
Age = ,
Major = "炼丹"
};
// 使用状态
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2);
entry.State = System.Data.Entity.EntityState.Added; // 修改数据
Student stuEdit = new Student()
{
StudentID=,
Age=
};
//状态
DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit);
entryEdit.State = System.Data.Entity.EntityState.Unchanged;
entryEdit.Property("Age").IsModified = true; // 删除数据
Student stuDel = new Student()
{
StudentID=
};
DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel);
entryDel.State = System.Data.Entity.EntityState.Deleted; // 保存
dbContext.SaveChanges();
Console.WriteLine("保存成功");
}
}
使用EntityState实现批处理功能,只需要执行一次SaveChange()就可以了,如果是使用原来的方式就需要多次执行SaveChange(),这样可以减少数据库的操作。
总结:无论是add、remove、savechanges都是根据EF包装实体的State进行相应的增删改操作。
Entity Framework应用:根据实体的EntityState状态实现增删改查的更多相关文章
- Entity Framework 教程——Entity Framework中的实体类型
Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...
- entity framework 新手入门篇(2)-entity framework基本的增删改查
经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...
- 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查
本文目录 使用EntityState枚举实现单个实体的增/删/改 增加:DbSet.Add = > EntityState.Added 标记实体为未改变:EntityState.Unchange ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- Entity Framework DBContext 增删改查深度解析
Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的 ...
- 手把手教你ASP.NET Core:使用Entity Framework Core进行增删改查
新建表Todo,如图 添加模型类 在"解决方案资源管理器"中,右键单击项目. 选择"添加" > "新建文件夹". 将文件夹命名为 Mo ...
- ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...
- [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...
- Entity - 使用EF框架进行增删改查 - 模型先行
模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...
随机推荐
- 增加一条新记录,同时返回其自增id
方法一.是在Insert或Update触发器中用select来返回需要的字段值.默认情况下,当insert时,触发其insert触发器,它的默认返回值是影响到的行数,语句是:select @@rowc ...
- linux分享一:网络设置
在Linux中,TCP/IP网络的配置信息存在几个不同的文件里面,这些文件分别就是 /etc/sysconfig/network. 网卡配置文件. /etc/hostc. /ect/resolv.co ...
- MySQL 5.6学习笔记(数据类型)
MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT.浮点小数类型FLOAT的 ...
- java.lang.CharSequence cannot be resolved
转自:http://jingyan.baidu.com/article/f25ef2546eace4482c1b82a9.html 方法/步骤 1 在MyEclipse中的配置方式为:右击项目-> ...
- Enum,Int,String的互相转换 枚举转换
Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...
- maven正式版本和快照版本的区别
Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...
- PC端页面同比例缩放
<meta name="viewport" content="width=1202"> //这行代码可以使PC端页面同比例缩放,不至于变形
- how-apache-flink-enables-new-streaming-applications-part-1
https://data-artisans.com/blog/how-apache-flink-enables-new-streaming-applications-part-1 http://www ...
- nginx 并发数问题思考:worker_connections,worker_processes与 max clients
我相信,很多人都跟我一样,看书都不会太细致也不太认真思考,感觉书中讲的东西都应该是对的,最近读书时我发现以前认为理所当然的东西事实上压根都没有弄明白,最终的结果是,书是别人的,书中的知识也是别人的. ...
- 每日英语:Booming Tech Sector Redraws the Map
China's high-tech companies have made their mark on the nation's economy. Now, with growing cash and ...