在上一篇文章中,我们讲解了使用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. Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换

    Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换 解决方法:添加格式说明信息 将下面语句: \docum ...

  2. sudo 的介绍

    http://chenfage.blog.51cto.com/8804946/1830424

  3. MySQL 5.6学习笔记(数据库基本操作,查看和修改表的存储引擎)

    1. 数据库基本操作 1.1  查看数据库 查看数据库列表: mysql> show databases; +--------------------+ | Database | +------ ...

  4. TaskAsyncHelper

    public static class TaskAsyncHelper { /// <summary> /// 将一个方法function异步运行,在执行完毕时执行回调callback / ...

  5. zabbix server 在配置客户端的时候 在zabbix server端的/etc/hosts文件的hostname 对应的ip这样可以更快的让server端发现agent端

    如下: # cat /etc/hosts 127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.loc ...

  6. AI重要算法

    https://www.quora.com/Is-a-single-layered-ReLu-network-still-a-universal-approximator/answer/Conner- ...

  7. angular-1.3 之ng-model-options指令

    ng-model-options是angular-1.3新出的一个指令,这篇文章就来介绍这个指令的用法. ng-model-options允许我们控制ng-model何时进行同步. 比如:1.当某个确 ...

  8. ES6,新增数据结构WeakSet的用法

    WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型. 特性: 1.元素必须是对象. 添加一个number类型的元素. const ws = ...

  9. ROC曲线(Receiver Operating Characteristic Curve)

    分类模型尝试将各个实例(instance)划归到某个特定的类,而分类模型的结果一般是实数值,如逻辑回归,其结果是从0到1的实数值.这里就涉及到如何确定阈值(threshold value),使得模型结 ...

  10. 安装Python2.7出现configure: error: no acceptable C compiler found in $PATH错误

    安装Python2.7出现configure: error: no acceptable C compiler found in $PATH错误 安装步骤: 安装依赖 yum groupinstall ...