asp net core中用efcore操作MySql数据库【包括事务回滚】

本文主要是介绍asp net core中用efcore操作MySql数据库【包括事务回滚】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、环境

  • 开发环境:Win11,VisualStudio2022,MySQL Server 8.0,.Net Core7.0

  • 测试
    在这里插入图片描述

二、MySQL和EFCore相关的包

用NuGet包管理器安装
​​​​​​​​​​​​​​在这里插入图片描述

三、数据库中设置

安装好MySQL数据库,做好基础设置,测试数据连接

用数据库管理软件登录:
在这里插入图片描述

四、创建数据库的表

本例只创建两个简单的表。
在这里插入图片描述
在创建一个标,后面用来进行数据库的事务操作。
在这里插入图片描述

五、dbContext的配置

1、配置的思路

在这里插入图片描述

2、DbContext类的实现

(1)公共构造函数和DbSet的定义

public class TodoContext : DbContext
{public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }public DbSet<User> Users { get; set; }public DbSet<UserLog> UserLogs { get; set; }
}

逐行解释:

public class TodoContext : DbContext{}

DbContext 是 Entity Framework Core 中的核心类,用于与数据库进行交互。本例定义了一个DbContext类型的对象TodoContext。

public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }

这是 TodoContext 的构造函数。
它接受一个 DbContextOptions 类型的参数 options。
: base(options) 表示它将这个 options 参数传递给基类(DbContext)的构造函数。
这允许你在创建 TodoContext 实例时配置数据库连接等选项。

public DbSet<User> Users { get; set; }
public DbSet<UserLog> UserLogs { get; set; }

定义了两个表DbSet

(2)DbSet如何绑定(映射)到数据库中的某个表[Table(“DB中表的名字”)]

  • 把Class User绑定到Table user
/// <summary>
/// User类映射到数据库中的哪一个表,映射到user表
/// </summary>
[Table("user")]
public class User
{/// <summary>/// name列【字段】/// </summary>[Key][Column("name")]public string name { get; set; }/// <summary>/// pw列【字段】/// </summary>[Column("pw")]public string pw { get; set; }
}
  • 把Class UserLog绑定到Table userlog
/// <summary>
///  UserLog类映射到数据库中的哪一个表,映射到userlog表
/// </summary>
[Table("userlog")]
public class UserLog
{[Key][Column("logInfo")]public string logInfo { get; set; }
}

3、asp net core中添加服务

var builder = WebApplication.CreateBuilder(args);  
//......//连接字符串
string conStr = "Server=localhost;Database=testdb;Uid=root;Pwd=abcxyz;";  //连接字符串
builder.Services.AddDbContext<TodoContext>(opt => opt.UseMySQL(conStr));       //启用DbContextvar app = builder.Build();

4、数据库的增删插改

  • insert
 //【1】======增加用户======//将信息Add到数据库中var user = new User { name = "ldh2", pw = "123456" };//这里如何获取todocontext对象呢dbContext.Users.Add(user);await dbContext.SaveChangesAsync();
  • update
//【2】======修改用户======
dbContext.Users.Where(x => x.name == "ldh2").First().pw = "pw123456";
await dbContext.SaveChangesAsync();
  • delete
//【3】======删除用户======
var userToDelete = dbContext.Users.Where(x => x.name == "ldh2").FirstOrDefault();
if (userToDelete != null)
{dbContext.Users.Remove(userToDelete);await dbContext.SaveChangesAsync();
}

5、数据库事务的使用

(1)在 users中添加一个item
(2)在userlogs表中添加一个日志信息
两个操作作为一个事务合并提交

using (var transaction = dbContext.Database.BeginTransaction())
{try{//添加一个用户var idx = dbContext.Users.Count();var newUser = new User { name = $"ldh2{idx + 1}", pw = "123456" };dbContext.Users.Add(newUser);//日志文档添加东西var idx2 = dbContext.UserLogs.Count();var newLog = new UserLog { logInfo = $"添加了一个用户:{newUser} -{idx2}" };dbContext.UserLogs.Add(newLog);//提交事务transaction.Commit();}catch (Exception e){transaction.Rollback();}
}

6、事务的失败和回滚

  • 下面添加一个重复key,故意引发异常进行回滚
var name = dbContext.Users.First().name;
var newUser = new User { name = $"{name}", pw = "123456" }; //key重复,引发异常
  • 提交事务,回滚事务
using (var transaction = dbContext.Database.BeginTransaction())
{try{//添加一个用户var name = dbContext.Users.First().name;var newUser = new User { name = $"{name}", pw = "123456" }; //key重复,引发异常dbContext.Users.Add(newUser);//日志文档添加东西var idx2 = dbContext.UserLogs.Count();var newLog = new UserLog { logInfo = $"添加了一个用户:{newUser} -{idx2}" };dbContext.UserLogs.Add(newLog);//提交事务transaction.Commit();}catch (Exception e){        transaction.Rollback();}
}

7、DbContext中的DbSet与ADO.NET的异同

大概在2003~2007年间用过ado.net(暴露年龄了),所以有点迷惑DbSet和ADO.NET到底有什么关系,所以用ai帮我整了一篇差异(尚未人工仔细复核)。
当然,这里是上述 Markdown 表格的字符串格式:

指标特性DbSet (EF Core)ADO.NET
抽象级别高级抽象低级抽象
编程模型对象关系映射 (ORM)数据集、数据表
SQL 查询主要使用 LINQ通常需要手写 SQL
数据映射自动映射到对象需要手动映射
变更跟踪自动跟踪实体变更需要手动管理
性能控制较少的底层控制更细粒度的控制
使用场景快速开发、复杂数据操作需要精细控制和高性能
学习曲线相对较陡相对较缓
数据库独立性较好较差
代码量通常较少通常较多
底层实现基于 ADO.NET直接实现
事务管理简化的 API需要更多手动控制
并发处理内置支持需要手动实现

这篇关于asp net core中用efcore操作MySql数据库【包括事务回滚】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110620

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1