【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查

文章目录

  • 【Entity Framework】EF中的增删改查
    • 一、概述
    • 二、DbContext数据上下文
    • 三、EntityState五个状态值
    • 四、EF添加数据
      • 4.1 EF Add方式
      • 4.2 EF 通过改变对象的状态为 Added
      • 4.3 调用方sql
      • 4.4 调用存储过程
    • 五、EF修改数据
      • 5.1 不查询数据库,主键必须赋值
      • 5.2 先查询实体再更新
    • 六、EF删除数据
      • 6.1 先查询数据,再根据查询的对象 ,删除对象
      • 6.2 自己创建对象,后附件,然后执行删除
      • 6.3 自己创建对象,然后放入EF容器,然后删除

在这里插入图片描述

一、概述

Entity Framework是一个O/R Mapping的实例框架,前面的博文介绍了Entity Framework的知识体系,本文将介绍EF基本使用,Entity Framework操作数据库,完成基本的增删改查。

二、DbContext数据上下文

DbContextEntity Framework中的一个核心的类,它充当了应用程序和数据库之间的桥梁。DbContext主要负责以下任务:

  • 定义数据库上下文:DbContext包含与数据库连接相关的信息,例如数据库提供程序、连接字符串等。它也可以被视为一个数据库的代理,应用程序通过它来访问数据库。
  • 定义实体映射:DbContext包含一个或多个DbSet,每个DbSet表示一个实体类型(通常是C#类)和数据库中的一个表。DbContext将实体类和数据库表之间的映射关系定义在一个模型中,这样就可以方便地进行数据的查询和操作。
  • 执行SQL查询:当使用Entity Framework进行数据查询时,DbContext会将LINQ查询转换为SQL查询,并发送到数据库执行。
  • 管理事务:DbContext提供了一个默认的事务管理器,用于管理数据库事务。在执行SaveChanges()方法时,事务自动提交或回滚。
  • 更改跟踪:DbContext跟踪每个实体的状态,包括新增(added)、修改(modified)和删除(deleted)状态。这使得在执行SaveChanges()方法时,Entity Framework能够生成正确的SQL语句来更新数据库。

三、EntityState五个状态值

SavaChanged()用于提交数据,db.SaveChanged() 返回值是数据库中有几条数据被影响,所以你可以用db.SaveChanged()>0来判断是否成功插入,修改,删除数据。

当执行SaveChanged()方法执行期间,会根据EntityState的值,决定是去新增(Added)、修改(Modified)、删除(Deleted)。来执行操作。

  db.Entry(userinfo).State = EntityState.Added;
序号字段说明
1Added4该对象是已添加到对象上下文的新对象,但尚未调用SaveChanges()方法。在保持更改后,对象状态更改为Unchanged。处于Added状态的对象在ObjectStateEntity中没有原始值。
2Deleted8已从对象上下文中删除该对象,在保存更改后,对象状态更改为Detached
3Detached1该对象在但未被跟踪。实体在创建之后且添加到对象上下文之前处于此状态。通过调用Detach(Object)方法从上下文中移除实体后,或者使用NoTrackingMergeOption加载实体后,该实体也会处于此状态。没有与处于ObjectStateEntry状态对象关联的Detached实体。
4Modified16对象上的一个标量属性已修改,但尚未调用SaveChanges()方法。在没有更改跟踪代理的POCO实体中,如果调用Modified方法,则已修改属性的状态将更改为DetechChanges()。保存更改后,对象状态更改为Unchanged
5Unchanged2自附加到上下文中后,或自上次调用SaveChanges()方法后,该对象尚未修改。

四、EF添加数据

要在数据源中插入数据时,必须创建实体类型的实例,并将该对象添加到对象上下文。 若要将新对象保存到数据源中,必须先设置不支持 null 值的所有属性。 使用实体框架 生成的类时,考虑使用实体类型的静态 Create对象名称 方法创建实体类型的新实例。 实体数据模型 工具生成实体类型时,会在每个类中包含此方法。 此创建方法用于创建对象的实例并设置此类的不能为 null 的所有属性。 此方法对于在 CSDL 文件中已应用 Nullable="false" 特性的每个属性都包含一个参数。

4.1 EF Add方式

RbacDBEntities db = new RbacDBEntities();
Role r1 = new Role()
{Name = “方式1”,Remark = “备注1”
};
db.Roles.Add(r1);
db.SaveChanges();

4.2 EF 通过改变对象的状态为 Added

Role r2 = new Role()
{Name = “方式2”,Remark = “备注2”
};
db.Entry(r2).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();

4.3 调用方sql

string sql = @“insert into roles values(‘方式3’,‘备注3’)”;
db.Database.ExecuteSqlCommand(sql);
db.SaveChanges();

4.4 调用存储过程

db.cp_insert_role(“方法4”, “备注4”);
Console.Read();

可以使用以下方法之一将新对象添加到对象上下文中:

  • ObjectSetAddObject方法。
  • ObjectContextAddObject方法
  • EntityCollectionAdd方法。对于实体框架生成的实体和代理对象,在附加主体对象时也会将添加的实体附加到上下文中,调用DetectChanges方法时将附件POCO实体。

在添加新对象时需要考虑下列注意事项:

  • 调用 SaveChanges 之前,实体框架 会为每个新对象生成一个临时的键值。 调用 SaveChanges 后,该键值会被插入新行时数据源所指定的标识值所取代。
  • 如果数据源未生成实体的键值,应指定一个唯一值。 如果两个对象具有相同的用户指定键值,则在调用 SaveChanges 时会发生InvalidOperationException。如果发生此问题,应指定唯一值并重试该操作。

五、EF修改数据

5.1 不查询数据库,主键必须赋值

为避免先查询数据库,可以直接将被修改的实体对象,添加到EF中管理,并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象的包装类对象对应属性为修改状态。

优点: 修改前不需要查询数据库

  1. 创建修改的实体对象
UserInfoes userInfonew = new UserInfoes()
{UserId=userInfo.UserId,Email = userInfo.Email,FirstName = userInfo.FirstName,LastName = userInfo.LastName,LastUpdateBy = GetCurrentUserGuid(),LastUpdate = DateTime.Now
}; 
  1. 添加到EF管理容器中

如果使用Entry附加实体对象到数据容器中,则需要手动设置实体包装类的对象的状态为Unchanged,或使用Attach(Attach方法:将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中从解释可以看出Attach方法主要目的就是把一个没有被dbContext跟踪的对象附加到dbCotext中使其被dbContext跟踪)。

db.Entry(userInfonew).State = System.Data.Entity.EntityState.Unchanged;

或者

db.UserInfoes.Attach(userInfonew);
  1. 更新字段

    1. 更新全部字段
     db.Entry(userInfonew).State = EntityState.Modified;
    
    1. 更新部分字段
    db.Entry(userInfonew).Property(x => x.Email).IsModified = true;
    
  2. 更新到数据库

db.SaveChanges();

特别提醒:主键必须赋值,如果不赋值,会报错“Store update,insert or delete statement affected an unexpected number of rows(0)”

5.2 先查询实体再更新

  1. 查询实体后更新数据库

    1. 先查询要修改的原数据(注意此处不要加AsNoTracking(),加了无法更新)
    var userInfoes= db.UserInfoes.Where(a => a.UserId== model.UserId).FirstOrDefault(); 
    
    1. 更新字段的值
    userInfoes.LastUpdateBy = GetCurrentUserGuid();
    userInfoes.LastUpdate = DateTime.Now;
    
    1. 更新到数据库
    db.SaveChanges(); 
    

    注意:EF查询出来的实体是无法更新主键的值

  2. 查询实体后不使用查询的实体,手动创建实体

 var query = await (from a in db.MesMachineConfigjoin c in db.Site_LinePositionon new {A = a.LineNum,B = a.MCPosition} equals new {A= c.LineNum,B=c.MCPosition}join b in db.DGHKROneReelNumManagerParamsSettings on a.MachineNum equals b.MachineNum into rightRowfrom rw in rightRow.DefaultIfEmpty()where a.Enable == "Y" && a.Size == dghkrOneReelNumManagerParamsSettingsDto.Sizeselect new {a,rw}

Attach的时候会报如下错误:因为相同类型的其他实体已具有相同的主键值。在使用 “Attach” 方法或者将实体的状态设置为 “Unchanged” 或 “Modified” 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为。

六、EF删除数据

6.1 先查询数据,再根据查询的对象 ,删除对象

var delSysUser = accountContext.SysUsers.FirstOrDefault(m.m.Id==userId)
if(delSysUser==null)
{accountContext.SysUsers.Remove(delSysUser);
}
var i = accountContext.SaveChanges();

6.2 自己创建对象,后附件,然后执行删除

SysUser delSysUser = new SysUser(){Id = delId};
accountContext.SysUsers.Attach(delSysUser);
accountContext.SysUsers.Remove(delSysUser);
var i = accountContext.SaveChanges();

6.3 自己创建对象,然后放入EF容器,然后删除

SysUser delSysUser=new SysUser(){Id = delId};
DbEntityEntry<SysUser> entityEntry = accountContext.Entry(delSysUser);
entityEntry.State = EntityState.Deleted;
var i = accountContext.SaveChanges();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目管理系统在制造业的应用,提高生产效率的秘诀与解决方案

缩短产品交货周期&#xff0c;提高产品交付率是当下很多制造业面临的难题&#xff0c;项目管理系统业务流程自动化&#xff0c;能够显著改善项目效率。接下来我们说一说项目管理系统在制造业的应用&#xff0c;项目管理系统制造业解决方案。 制造业典型的项目背景 随着企业体量…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串&#xff08;SDS&#xff09;1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串&#xff08;SDS&#xff09; 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字…

【Java项目】基于SpringBoot的【就业信息管理系统】

在当今这个科技迅猛发展的时代&#xff0c;计算机技术在生活中扮演着至关重要的角色&#xff0c;特别是在信息管理领域。在这样的背景下&#xff0c;学习计算机知识不只是简单地掌握一项技能&#xff0c;更关键的是将所学知识应用于实际&#xff0c;以创新的思维不断简化人们的…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课&#xff1a;华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课&#xff1a;华为HCIP认证课程介绍-CSDN博客 职场进阶&#xff0c;踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 &#xff1a; 超级实用&#xff0c;华为VRP系统文件…

8.6 循环神经网络的简洁实现

每个步长共用参数 加载数据 虽然 8.5节 对了解循环神经网络的实现方式具有指导意义&#xff0c;但并不方便。 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from…

#include<初见C语言之指针(5)>

目录 一、sizeof和strlen的对比 1. sizeof 2.strlen 二、数组和指针题解析 1. ⼀维数组 1.1数组名理解 2.字符数组 3. ⼆维数组 三、指针运算题解析 总结 一、sizeof和strlen的对比 1. sizeof 我们前面介绍过sizeof是单目操作符 sizeof括号中有表达式&#xff0c;不…

解决PATH变量污染的问题

文章目录 解决PATH变量污染的问题概述笔记清空PATH变量之后的系统设置在命令行查看清空后的PATH变量以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例以系统命令 where为例run_vs2019.bat备注 - 批处理的后缀最好是batEND 解决PATH变量污染的问题 概述 随着不断安装新软件,…

一文彻底搞懂如何创建线程

文章目录 1. java创建线程(Thread)方式2. 继承 Thread 类3. 实现 Runnable 接口4. 实现 Callable 接口5. 使用线程池6. 使用匿名类 1. java创建线程(Thread)方式 方式一&#xff1a;继承于Thread类&#xff0c;这是最常见的创建线程的方式之一&#xff0c;通过继承 Thread 类并…

BeanDefinition

这里写目录标题 BeanDefinitionBeanDefinitionReaderAbstractBeanDefinitionReaderXmlBeanDefinitionReader BeanDefinition 上述Spring的基本运行中&#xff0c;你所有的定义描述信息都在XML文件里面&#xff0c;如何读取呢&#xff1f; 当然通过 new ClassPathXmlApplicatio…

常见微服务的组件?

注册中心&#xff1a;就是一个服务注册的地方&#xff0c;我们可以把拆分的服务注册到注册中心&#xff0c;这样注册中心就能管理这些服务&#xff0c;服务之间的调用就会很方便&#xff0c;通过服务名就能相互调用。 负载均衡&#xff1a;被调用放的负载均衡&#xff0c;比如…

【智能算法】黄金正弦算法(GSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年&#xff0c;Tanyildizi等人受到正弦函数单位圆内扫描启发&#xff0c;提出了黄金正弦算法&#xff08;Golden Sine Algorithm, GSA&#xff09;。 2.算法原理 2.1算法思想 GSA来源于正弦函…

FreeBSD下路由问题留档

碰到了一个非常神奇的事情&#xff0c;一台笔记本有以太网和wifi&#xff0c;都可以连到同一台路由器&#xff0c;ip地址配置在同一网段&#xff0c;但是如果插上网线&#xff0c;再拔掉网线的话&#xff0c;那么wifi即使连上&#xff0c;也无法上网。 看路由信息&#xff0c;发…

【Spring源码分析】透过源码看透Spring事务

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入&#xff08;一&#xff09;【Spring源码分析】…

书生浦语笔记一

2023年6月&#xff0c;InternLM的第一代大模型正式发布。仅一个月后&#xff0c;该模型以及其全套工具链被开源。随后&#xff0c;在8月份&#xff0c;多模态语料库chat7B和lagent也被开源。而在接下来的9月份&#xff0c;InternLM20B的开源发布进一步加强了全线工具链的更新。…

所有企业都在用的微服务框架,需要多强的服务集成能力?

在数字化时代&#xff0c;随着业务规模的扩大和系统复杂性的增加&#xff0c;传统的单体应用架构由于其固有的局限性&#xff0c;已无法高效支撑企业日益增长的业务需求。 为了突破这一瓶颈&#xff0c;微服务架构以其独特的优势崭露头角&#xff0c;逐渐成为企业数字化转型的…

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…

【刷题】 二分查找入门

送给大家一句话: 总有一天&#xff0c;你会站在最亮的地方&#xff0c;活成自己曾经渴望的模样—— 苑子文 & 苑子豪《我们都一样 年轻又彷徨》 二分查找入门 1 前言2 Leetcode 704. 二分查找2.1 题目描述2.2 算法思路 3 Leetcode 34. 在排序数组中查找元素的第一个和最后…

学习笔记——C语言基本概念指针(下)——(8)

1.指针和数组 数组指针 -- 指向数组的指针。 指针数组 -- 数组的元素都是指针。 换句话理解就是&#xff1a;数组指针就是个指针&#xff0c;指针数组就是个数组。 1.1数组指针 数组指针&#xff1a;指向数组的指针&#xff1b; 先回顾一下数组的特点&#xff1a; 1.相…

【C语言】联合体、枚举: 联合体与结构体区别,枚举的优点

目录 1、联合体 1.1、什么是联合体 1.2、联合体的声明 1.3、联合体的特点 1.4、联合体与结构体区别 1.5、联合体的大小 2、枚举 2.1、枚举类型的声明 2.2、枚举类型的优点 3、三种自定义类型&#xff1a;结构体、联合体、枚举 正文 1、联合体 1.1、什么是联合体 联…