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 = 14, Age = 690 }; // 通过上下文获取对象相关信息 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 = 14 }; 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 = 3422, 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 = 456, Major = "冶金专业" }; dbContext.Students.Add(stu1); // 新增数据2 Student stu2 = new Student() { StudentName = "青牛精", Age = 345, Major = "炼丹" }; // 使用状态 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2); entry.State = System.Data.Entity.EntityState.Added; // 修改数据 Student stuEdit = new Student() { StudentID=5, Age=678 }; //状态 DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit); entryEdit.State = System.Data.Entity.EntityState.Unchanged; entryEdit.Property("Age").IsModified = true; // 删除数据 Student stuDel = new Student() { StudentID=22 }; 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状态实现增删改查,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!
相关文章
基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序
这篇文章主要介绍了ASP.NET Core启动地址配置方法及优先级顺序, .NET 6 使用了最小 WEB API, 配置方式已经部分发生了变化,下面文章我们来看看具体的方法,需要的小伙伴可以参考一下2022-03-03在 .NET 中使用 FixedTimeEquals 应对计时攻击的例子
在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,这篇文章主要介绍了在 .NET 中使用 FixedTimeEquals 应对计时攻击,需要的朋友可以参考下2022-06-06DotNetCore深入了解之HttpClientFactory类详解
这篇文章主要给大家介绍了关于DotNetCore深入了解之HttpClientFactory类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧2019-03-03asp.net用url重写URLReWriter实现任意二级域名 新
最近有个朋友要做url重写的东西,我帮他弄了弄,回头看当年自己写的那个文章,当时以为自己写的很容易理解.但现在再看却觉得写的不好.而今天百度了一下urlrewriter发现我这个文章竟然排第二.为了方便更多朋友,我再写点东西补充下.2009-11-11
最新评论