ASP.NET 使用 EF Core 连接 MySQL 8.0

更新日期: 2024-09-08 阅读次数: 900 字数: 1010 分类: Windows

版本

  • ASP.NET Core in .NET 8.0
  • MySQL 8.0

EF Core 是什么

Entity Framework Core (中文名称更抽象,还是记住英文名吧),即 EF Core, 是微软官方的 ORM(对象关系映射)框架,它允许开发者使用 .NET 对象来操作数据库,从而避免了直接编写大量的数据访问代码。EF Core 支持:

  • 多种数据库,如 SQL Server、MySQL、PostgreSQL 和 SQLite 等
  • 支持跨平台 Windows, Linux 都可以。而我的服务器基本都是 Ubuntu 加 MySQL,所以才考虑使用 .NET
  • 自动迁移,即 Migration 功能
  • 异步查询
  • LINQ 支持:EF Core 通过集成 LINQ(Language Integrated Query)提供了强大的查询功能,并简化代码。

Pomelo.EntityFrameworkCore.MySql V.S. MySql.EntityFrameworkCore

EF Core 是通过不同的数据库 provider 来访问不同类型的数据库。

Entity Framework Core can access many different databases through plug-in libraries called database providers.

具体清单,可以参考微软官方的文档:

https://learn.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli

可以看到针对 MySQL 有两个主要的 provider:即 Pomelo.EntityFrameworkCore.MySql 和 MySql.EntityFrameworkCore。

Pomelo.EntityFrameworkCore.MySql 是三方实现的一个库,在 github 上开源,一直在更新,也支持最新的 MySQL 9. 在找示例代码时,发现网上的资料基本都是基于这个库的。同时,这个库也支持 MariaDB。

Pomelo.EntityFrameworkCore.MySql is the most popular Entity Framework Core provider for MySQL compatible databases. It supports EF Core up to its latest version and uses MySqlConnector for high-performance database server communication.

而 MySql.EntityFrameworkCore 则是 Oracle 官方维护的一个库,这个库是不开源的,网上不少评价说这个库问题很多(几年前的评论)。 我觉得应该不至于这么多问题,从下载量来看,反而 Oracle 这个库的下载量比三方开源的库更多。都是几百万的下载量。

纠结了一下,还是选择了 Pomelo 那个开源的库。

安装依赖

对于 MySQL 安装:

dotnet.exe add package Pomelo.EntityFrameworkCore.MySql

安装后,xxx.proj 会新增一行:

<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />

连接字符串

在 appsettings.Development.json 和 appsettings.json 配置文件中,可以分别配置开发环境和生产环境的 MySQL 连接字符串。

例如:

"ConnectionStrings": {
  "DefaultConnection": "Server=localhost;Database=sunzhongwei.com;User=root;Password=password;"
}

这个配置后续会用到。

Models

在 Models 目录下,可以新建一个类,来映射数据库中的一个表。例如:

using System.ComponentModel.DataAnnotations.Schema;

namespace sunzhongwei.Models;

[Table("user")]
public class User
{
    public int Id { get; set; }
    public required string Name { get; set; }
}

注意,最好是通过 Table 注解来将 C# 类映射到 MySQL 数据库的对应表名。 不如,不使用 Table 注解,容易出现诡异的问题。

例如,在 Windows 开发环境中,不使用 Table 注解,上面代码是可以正常运行的。

但是在生产环境 Ubuntu Server 中,这个代码就会报错:

MySqlConnector.MySqlException (0x80004005): Table 'sunzhongwei.com.User' doesn't exist

也就是说在 Linux 下,MySQL 表名是大小写敏感的,无法将 C# User 类(大写)自动映射到 MySQL user 表(小写).

Context

新建一个 Data 目录或者 Context 目录,在其中新建一个文件 ApplicationDbContext.cs

namespace sunzhongwei.Data;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    public DbSet<User> User { get; set; }
}

Program.cs

这里就用到了上面的连接字符串:

var dbConnectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
{
    options.UseMySql(dbConnectionString, ServerVersion.AutoDetect(dbConnectionString));
});

MVC Controller 中使用

public class SomeController: Controller
{
    private readonly AppDbContext _context;

    public TimestampController(AppDbContext context)
    {
        _context = context;
    }
}

使用这个 AppDbContext 就能对数据库进行操作了。

GlobalUsings.cs

create a GlobalUsings.cs file in the root directory. This allows us to state all the import packages in one file so that we don’t have to import them in every single file.

使用这个,可以省去重复写 using 的苦恼。

可以把 EF Core 及 Models 都放到全局引入:

global using Microsoft.EntityFrameworkCore;
global using sunzhongwei.Models;
global using sunzhongwei.Data;

参考

  • https://learn.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro?view=aspnetcore-8.0 但是这个文档不适合 .NET 8, 因为 6 之后,简化了 Program.cs
  • https://learn.microsoft.com/en-us/aspnet/core/data/ef-rp/intro?view=aspnetcore-8.0&tabs=visual-studio-code#scaffold-student-pages Razor 可以通过 dotnet-aspnet-codegenerator 自动生成 CRUD 页面,看起来比较方便。官方也在推荐 Razor 替代 MVC,但是 Razor 增加解决 API 问题呢
  • https://github.com/braz2021/Exo.WebApi/blob/main/Program.cs .NET 8 参考

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

tags: dotnet