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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,