在上一篇文章中,我们讲解了使用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状态实现增删改查的更多相关文章

  1. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  2. entity framework 新手入门篇(2)-entity framework基本的增删改查

    经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...

  3. 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查

    本文目录 使用EntityState枚举实现单个实体的增/删/改 增加:DbSet.Add = > EntityState.Added 标记实体为未改变:EntityState.Unchange ...

  4. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  5. Entity Framework DBContext 增删改查深度解析

    Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的 ...

  6. 手把手教你ASP.NET Core:使用Entity Framework Core进行增删改查

    新建表Todo,如图 添加模型类 在"解决方案资源管理器"中,右键单击项目. 选择"添加" > "新建文件夹". 将文件夹命名为 Mo ...

  7. ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...

  8. [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...

  9. Entity - 使用EF框架进行增删改查 - 模型先行

    模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...

随机推荐

  1. glide 镜像

    运行glide install 失败  国内墙的原因, 某些网站上不去 [ERROR]Update failed for golang.org/x/crypto: Cannot detect VCS ...

  2. MySQL 5.6学习笔记(查询数据、插入、更新、删除数据)

    1. 查询语法 SELECT {*|<字段列表>} [FROM table_references [WHERE where_condition] [GROUP BY {col_name | ...

  3. Android App开发技能图谱(转载)

    操作系统 Windows/MacOSX/Linux 编程语言 Java HTML/JS (Hybrid/Web App) C/C++ (NDK) SQL (DB) Kotlin 开发工具 IDE An ...

  4. [sql]mysql5.6cmake安装/mysql5.7二进制安装

    centos7上cmake编译安装mysql-5.6.36.tar.gz 系统环境 - 环境(安装前规划好主机名,mysql编译过程会用) [root@n1 mysql-5.6.36]# cat /e ...

  5. CCDictionary

    /** * CCDictionary is a class like NSDictionary in Obj-C . * * @note Only the pointer of CCObject or ...

  6. Java中创建String的两种方式差异

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  7. Android 编程下 Eclipse 恢复被删除的文件

    开发过程中文件误删除,又没有 Git,SVN 等版本控制软件的备份,怎么办? Eclipse 自带了恢复历史文件的功能:在项目上点击右键,选择 Restore from Local History,在 ...

  8. 关于 android receiver

    可以在代码文件中声明一个receiver,也可以在manifest中声明一个,前者中的receiver只有在该activity launch起来以后才会监听其所感兴趣的事件,而如果在androidMa ...

  9. Beginning SDL 2.0(5) 基于MFC和SDL的YuvPlayer

    本文是在“Beginning SDL 2.0(4) YUV加载及渲染”(以下简称BS4)基础上做的功能完善,如果你对之间介绍的内容了解不多,麻烦先阅读之前的内容. 本文主要介绍如何完成一个基于MFC和 ...

  10. 【机器学习】K-Means算法

    K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示.我们可以看到, ...