五分钟带你快速上手EFCore操作MySQL

五分钟带你快速上手EFCore操作MySQL

码农世界 2024-05-30 后端 88 次浏览 0个评论

1.EFCore简介

Entity Framework Core 是一个轻量级、跨平台的 ORM 框架,它允许 .NET 开发人员通过面向对象的方式访问数据库。EF Core 可以与各种关系型数据库进行交互,包括 SQL Server、MySQL、PostgreSQL 和 SQLite 等。

2.相关依赖安装

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

五分钟带你快速上手EFCore操作MySQL

注意版本的选择尽量与.NET版本一致,我这里使用的.NET6.0。

3 配置MySQL连接信息

在appsettings.json中添加mysql连接配置如下

Python
  "ConnectionStrings": {
    "tarefasConnection": "server=localhost;port=3306;uid=root;pwd=123456;database=partner"
  }

五分钟带你快速上手EFCore操作MySQL

4 新建User类和UserContext类

代码如下:

User.cs

Python
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace WebApplication4.db
{
    public class User
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }
        [Column("username")]
        public string UserName { get; set; } = null!;
        [Column("password")]
        public string PassWord { get; set; } = null!;
        [Column("departmentname")]
        public string DepartmentName { get; set; } = null!;
    }
}

UserContext.cs

Python
using Microsoft.EntityFrameworkCore;
using WebApplication4.db;
/// 
/// 这个类用于管理与数据库的交互。
/// 
public partial class UserContext : DbContext
{
    public UserContext()
    {
    }
    public UserContext(DbContextOptions options) : base(options)
    {
    }
    //这行代码定义了一个 User 属性,该属性表示数据库中的用户表。
    //通过在 DbContext 中声明这样的属性,Entity Framework Core 就能够跟踪和操作与该实体类相关联的数据库表。
    //当你对 User 属性进行查询、插入、更新或删除时,
    //Entity Framework Core 会负责将这些操作转化为相应的 SQL 查询并与数据库进行交互。
    public virtual DbSet User { get; set; } = null!;
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.UseCollation("utf8_general_ci").HasCharSet("utf8");
        //指定表名为 "user",设置 "password" 列的最大长度为 200。
        modelBuilder.Entity(entity =>
        {
            entity.ToTable("user");
            entity.Property(e => e.PassWord)
                .HasMaxLength(200)
                .HasColumnName("password");
        });
        OnModelCreatingPartial(modelBuilder);
    }
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

5 关于UserContext类的说明

UserContext类继承了DbContext这个类,DbContext是 EFCore 中的一个核心类,它充当了应用程序和数据库之间的桥梁,负责管理与数据库的交互。它提供了一种表示数据模型、配置数据连接和执行数据库操作的方式。以下是 DbContext的主要功能和作用:

5.1 表示数据模型

DbContext类通过使用 DbSet 属性来表示数据库中的表。每个 DbSet 属性都对应一个实体类型,表示数据库中的一张表。这些实体类型通常是应用程序中的类,它们映射到数据库中的表结构。

Python
public class MyDbContext : DbContext
{
    public DbSet Users { get; set; }
    public DbSet Todos { get; set; }
    // 其他 DbSet 属性
}

5.2 配置数据库的连接

DbContext用于配置连接到数据库的信息,例如数据库的提供程序(SQL Server、MySQL、SQLite 等)、连接字符串、连接池大小等。这些配置通常在 OnConfiguring 方法中设置,或者通过构造函数传递 DbContextOptions。

Python
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("your_connection_string");
}

5.3 执行数据库操作

DbContext提供了方法来执行对数据库的各种操作,例如查询、插入、更新和删除。这些方法包括 Set()、Add()、Update()、Remove() 等。LINQ 查询也是通过 DbContext来执行的。

5.4 事务操作

DbContext支持事务操作,你可以在一个事务中执行一系列数据库操作,然后一次性提交或回滚。

Python
using (var transaction = dbContext.Database.BeginTransaction())
{
    try
    {
        // 执行一系列数据库操作
        dbContext.SaveChanges();
        transaction.Commit();
    }
    catch (Exception)
    {
        transaction.Rollback();
    }
}

6 依赖注入

在program.cs中注入UserContext依赖。

Python
builder.Services.AddDbContext(opt =>
{
    string connectionString = builder.Configuration.GetConnectionString("tarefasConnection");
    var serverVersion = ServerVersion.AutoDetect(connectionString);
    opt.UseMySql(connectionString, serverVersion);
});

五分钟带你快速上手EFCore操作MySQL

7.执行迁移操作

7.1 什么是迁移

在 EFCore 中,迁移(Migration)是一种将数据模型的变化应用到数据库的机制。当你对应用程序的数据模型进行更改时,可能会涉及到添加新表、更改表结构、删除表等操作。为了使这些变化反映在数据库中,你需要执行迁移。步骤如下:

点击工具-->NuGet包管理器-->程序包管理控制台:

五分钟带你快速上手EFCore操作MySQL

输入以下命令:

Python
Add-Migration init
Update-Database

五分钟带你快速上手EFCore操作MySQL

无报错的情况下,即完成迁移操作。此时在项目的目录下可以看到一个新的文件夹Migrations,是用于存储迁移文件的地方。UserContextModelSnapshot.cs里存放的是数据模型的快照,快照(Snapshot)是用于记录数据模型当前状态的一个内部数据结构。它在迁移过程中发挥着重要的作用。当你创建迁移时,EF Core 使用快照来比较当前数据模型与之前迁移所生成的模型之间的差异,从而生成一个新的迁移。

五分钟带你快速上手EFCore操作MySQL

7.1 打开Navicate查看表结构

五分钟带你快速上手EFCore操作MySQL

8 数据增删改查接口

UserController.cs

Python
using Microsoft.AspNetCore.Mvc;
using WebApplication4.db;
namespace WebApplication4.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    {
        UserContext userContext;
        public UserController(UserContext userContext)
        {
            this.userContext = userContext;
        }
        /// 
        /// 新增用户
        /// 
        /// 
        /// 
        /// 
        [HttpPost]
        public ObjectResult AddUser([FromBody] User user)
        {
            try
            {
                userContext.User.Add(user);
                userContext.SaveChanges();
                return new ObjectResult("用户添加成功");
            }
            catch(Exception ex) 
            {
                throw ex;
            }
        }
        [HttpGet]
        public ObjectResult getUsers() {
            try
            {
                List users = userContext.User.ToList();  //查出所有
                return new ObjectResult(users);
            }
            catch( Exception ex )
            {
                throw ex;
            }
        }
        [HttpDelete]
        public ObjectResult DelUserById(int id) {
            var user = userContext.User.Find(id);
            if (user != null)
            {
                try
                {
                    userContext.User.Remove(user);
                    userContext.SaveChanges();
                    return new ObjectResult("用户删除成功");
                }catch(Exception ex)
                {
                    throw ex;
                }
            
            }
            else
            {
                return new ObjectResult("用户不存在");
            }
        }
        [HttpPut]
        public ObjectResult update([FromBody]User user)
        {
            try
            {
                userContext.User.Update(user);
                userContext.SaveChanges();
                return new ObjectResult("修改成功");
            }catch(Exception ex)
            {
                throw ex;
            }
        }
    }
}

2024年3月22补充:

Scaffold-DbContext "server=localhost;userid=root;pwd=123456;port=3306;database=manager;sslmode=Preferred;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force

在程序包股那里控制台输入此命令可生成数据库中每个表对应的实体类。

转载请注明来自码农世界,本文标题:《五分钟带你快速上手EFCore操作MySQL》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,88人围观)参与讨论

还没有评论,来说两句吧...

Top