【Entity Framework】EF中的增删改查

news2024/11/26 2:49:35

【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.MesMachineConfig
                    join c in db.Site_LinePosition
                    on 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 rightRow
                    from rw in rightRow.DefaultIfEmpty()
                    where a.Enable == "Y" && a.Size == dghkrOneReelNumManagerParamsSettingsDto.Size
                    select 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.coloradmin.cn/o/1563394.html

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

相关文章

为什么品牌宣传需要深度稿件?媒介盒子揭秘

在信息洪流中&#xff0c;品牌想要占据用户心智仅靠传统的广告方式很难达成目标&#xff0c;只有真正有价值的信息才能吸引用户注意力&#xff0c;品牌方可以通过深度稿件来实现。 深度传播稿是一种高质量的、需要花费较长时间和精力来撰写的宣传文章&#xff0c;篇幅较长&…

自动化测试工具-DrissionPage

1、前言 自动化测试工具在现代软件开发中扮演着至关重要的角色。它们不仅能够提高测试效率&#xff0c;减少人为错误&#xff0c;还能够帮助开发团队更快速地交付高质量的软件产品。 本文将介绍一款简洁而强大的自动化测试工具-DrissionPage 2、简介 DrissionPage是一款基于…

Laya1.8.4 UI长按选择对应位置释放技能

需求&#xff1a; 需要实现拖拽摇杆选择技能释放位置&#xff0c;释放技能。 原理&#xff1a;首先拆分需求&#xff0c;分为两部分&#xff0c;UI部分和场景部分&#xff0c;UI部分需要实现长按效果&#xff0c;长按后又要有拖动效果&#xff0c;将官方文档的示例代码改了改…

ETL工具-nifi干货系列 第七讲 处理器JoltTransformJSON(续)

第六讲教程只简单介绍了Jolt的chain转换模式&#xff0c;本节课介绍下Jolt的各种转换模式。 点击的处理器JoltTransformJSON高级配置选项&#xff0c;进行测试Jolt的转换模式。 1、Cardinality&#xff1a;更改了输入JSON数据元素的基数&#xff0c;适用于jsonObj和jsonList 之…

【JavaSE】解密 继承和多态(上)

前言 本篇将会通过典型代码案例来揭开 Java中继承和多态 的神秘面纱~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 继承 继承代码举例 子类访问父类的成员变量和方法 子类访问父类的成员变量 super this和su…

实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程--含数据集)

导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。 安装环境 【1】安装torch, torchvision对应版本,这里先下载好,直接安装 pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whlpip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl 安装好…

每日一题 --- 右旋字符串[卡码][Go]

右旋字符串 题目&#xff1a;55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面…

书生浦语第一次课

模型的发展 从专业模型到通用模型 书生浦语大模型全链路开源体系 2023.06.07 -> InternLM千亿参数语言大模型发布 2023.07.06 -> InternLM千亿参数语言大模型全面升级&#xff0c;支持8K语境、26种语言。全面开源、免费商用&#xff1a;InternLM-7B、全链条开源工具…

【内存泄漏】数据库连接connectionPhantomRefs内存过大

1. 问题背景 线上出现内存报警&#xff0c;内存增长曲线如下 dump内存文件&#xff0c;临时重新发布服务。后经排查发现是数据库连接池设置不合理以及mysql-connector-java 5.1.49有内存泄漏bug。以下为对此问题的分析及问题总结。 1.1 应用背景 数据库连接池&#xff1a; …

赛奥分离技术现已加入2024第13届生物发酵展

参展企业介绍 上海赛奥分离技术工程有限公司成立于2010年,是上海市高新技术企业、上海市专精特新企业&#xff0c;宝山区工程及技术中心。公司着重于在流体分离净化领域&#xff0c;研究开发制造膜技术领域中错流微滤、超滤系统、纳滤系统、反渗透、精细过滤等膜分离设备及适用…

光伏无人机:绿色能源与航空技术的融合创新

在可再生能源和无人机技术快速发展的背景下&#xff0c;光伏无人机作为一种新兴的绿色航空器&#xff0c;正逐渐展现出其独特的优势和广阔的应用前景。本文将深入探讨光伏无人机的原理、优势以及其在多个领域的应用&#xff0c;展望其未来的发展趋势。 一、光伏无人机的原理 光…

【LeetCode】热题100 刷题笔记

文章目录 T1 两数之和T49 字母异位词分组常用小技巧 T1 两数之和 链接&#xff1a;1. 两数之和 题目&#xff1a; 【刷题感悟】这道题用两层for循环也能做出来&#xff0c;但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法&#xff0c;不能因为它是第一道 …

SAP Fiori开发中的JavaScript基础知识6 - 数组(Arrays)

1 背景 在本篇博客中&#xff0c;我将介绍JavaScript中数组&#xff08;Arrays&#xff09;的概念和用法。 2 数组 在JavaScript中&#xff0c;数组是一种特殊的对象&#xff0c;用于存储多个值在单个变量中。 2.1 创建数组 在JavaScript中&#xff0c;创建数组有以下有2种…

鸿蒙OS元服务开发说明:【WebGL网页图形库开发接口】

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更…

反弹shell的方法和场景

Netcat反弹Shell 1 NC正向反弹shell Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、 反弹Shell、端口监听和文件传输等操作,常用参数如下&#xff1a; -c指定连接后要执行的shell命令-e指定连接后要执行的文件名-k配置 Socket一…

制造业工厂怎么通过MES系统来升级改造车间管理

在当今高度竞争的市场环境下&#xff0c;制造业企业需要不断提高生产效率&#xff0c;以在激烈的竞争中立于不败之地。而一种被广泛应用的方法就是利用MES控制系统&#xff0c;通过数字化管理和自动化控制来改造生产车间提升生产效率。 1、MES管理系统能够实现对生产过程的全面…

Linux环境基础和工具的使用

目录 1、Linux软件包管理器---yum 2、Linux开发工具 2.1、vim基本概念 2.2 vim基本操作 2.3 vim正常模式命令集 2.4 vim末行模式命令集 2.5 简单vim配置 2.5.1 配置文件的位置 3 Linux编译器--gcc/g的使用 3.1 背景知识 3.2 gcc完成 4 Linux调试器--gdb使用 4.1 背…

网页的血液——javascript

JavaScript 基础知识概述 1. JavaScript 介绍 JavaScript 是一种高级的、解释型的编程语言&#xff0c;它是一种基于对象的、事件驱动的语言&#xff0c;它允许开发者创建动态的网页。JavaScript 是一种脚本语言&#xff0c;它可以嵌入到 HTML 中&#xff0c;或者作为外部文件…

一篇商业稿件值千元,我的过稿经验大公开

撰写过上百篇企业和品牌稿件&#xff0c;甚至一篇商业稿件可值千元&#xff0c;可能很多人还不太相信&#xff0c;事实就是真的会有很多的企业和品牌愿意为此买单&#xff0c;是因为稿件带来的价值也是无法衡量的&#xff0c;直接给产品或是品牌带来更多的曝光甚至转化。今天伯…

一种新的基于STT-MRAM的时域内存计算单元

大数据、物联网和人工智能等技术的进步揭示了传统冯诺依曼的瓶颈架构&#xff0c;导致高能耗和有限的内存带宽。内存计算&#xff08;IMC通过直接在内存中进行计算&#xff0c;提高了能效&#xff0c;提供了一个有前景的解决方案计算。现有的基于时域&#xff08;TD&#xff09…