Phiên bản

Phiên bản

đá gà trực tiếp app,King79 Club Game Bài Đổi Thưởng Uy Tín,nhà cái khuyến mãi thành viên mới 50k

ASP.NET Sử dụng EF Core kết nối với MySQL 8.0

Ngày cập nhật: 2024-09-08 | Số lần đọc: 2180 | Số từ: 1010 | Phân loại: Windows
Tìm kiếm

  • ASP.NET Core trên nền .NET 8.0
  • MySQL 8.0

EF Core là gì?

Entity Framework Core (viết tắt là EF Core) là một framework ORM (Object Relational Mapping) chính thức do Microsoft phát triển. Công cụ này cho phép các lập trình viên thao tác với cơ sở dữ liệu thông qua các đối tượng trong ngôn ngữ lập trình .NET, giúp giảm bớt việc viết nhiều đoạn mã truy xuất dữ liệu trực tiếp. EF Core hỗ trợ:

  • Nhiều loại cơ sở dữ liệu như SQL Server, MySQL, PostgreSQL và SQLite…
  • Hỗ trợ đa nền tảng: có thể chạy được trên cả Windows lẫn Linux. Vì phần lớn máy chủ của tôi đều dùng Ubuntu cùng MySQL nên tôi quyết định chọn .NET để phát triển ứng dụng.
  • Tính năng tự động di chuyển cơ sở dữ liệu (Migration).
  • Truy vấn bất đồng bộ (Asynchronous Query).
  • Hỗ trợ LINQ (Language Integrated Query): EF Core tích hợp LINQ mạnh mẽ, giúp đơn giản hóa các câu lệnh truy vấn.

Pomelo.EntityFrameworkCore.MySql so với MySql.EntityFrameworkCore

EF Core sử dụng các thư viện cung cấp (database provider) khác nhau để truy cập vào các loại cơ sở dữ liệu tương ứng.

Entity Framework Core có thể truy cập vào nhiều hệ thống cơ sở dữ liệu khác nhau thông qua các thư viện mở rộng gọi là database providers.
Danh sách đầy đủ các provider có thể xem tại tài liệu chính thức của Microsoft:

Trong danh sách đó, có hai thư viện phổ biến dành cho MySQL: Pomelo.EntityFrameworkCore.MySqlMySql.EntityFrameworkCore.

Thư viện Pomelo.EntityFrameworkCore.MySql là một thư viện thứ ba, nguồn mở, hiện đang được cập nhật thường xuyên và hỗ trợ phiên bản mới nhất của MySQL 9. Khi kiểm tra các ví dụ mẫu, tôi thấy đa số tài liệu hướng dẫn trực tuyến đều dựa trên thư viện này. Ngoài ra, thư viện này cũng hỗ trợ MariaDB.

Pomelo.EntityFrameworkCore.MySql là một trong những thư viện phổ biến nhất dành cho các cơ sở dữ liệu MySQL tương thích. Thư viện này hỗ trợ các phiên bản EF Core mới nhất và sử dụng MySqlConnector để giao tiếp hiệu quả với máy chủ cơ sở dữ liệu.

Còn MySql.EntityFrameworkCore là thư viện do Oracle bảo trì chính thức, tuy nhiên đây là một thư viện đóng nguồn. Trên mạng có không ít ý kiến đánh giá rằng thư viện này gặp nhiều lỗi (đặc biệt là cách đây vài năm). Tuy nhiên, theo số liệu thống kê về lượt tải xuống, thì thư viện này lại có lượng người dùng cao hơn hẳn thư viện Pomelo, lên đến hàng triệu lượt.

Sau khi cân nhắc kỹ lưỡng, tôi vẫn quyết định sử dụng thư viện Pomelo vì tính ổn định và cộng đồng hỗ trợ tốt hơn.

Cài đặt phụ thuộc

Để cài đặt Pomelo.EntityFrameworkCore.MySql, bạn có thể chạy lệnh sau:

1
dotnet.exe add package Pomelo.EntityFrameworkCore.MySql

Sau khi cài đặt xong, file cấu hình xxx.proj sẽ thêm dòng sau:

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

Chuỗi kết nối

Bạn có thể cấu hình chuỗi kết nối tới MySQL trong các file appsettings.Development.jsonappsettings.json, tương ứng cho môi trường phát triển và sản phẩm. Ví dụ:

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

Chuỗi kết nối này sẽ được sử dụng ở các bước sau.

Mô hình (Models)

Tạo một lớp mới trong thư mục Models để ánh xạ sang bảng trong cơ sở dữ liệu. Ví dụ:

1
2
3
4
5
6
7
8
9
using System.ComponentModel.DataAnnotations.Schema;
namespace sunzhongwei.Models;

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

Lưu ý rằng, nên sử dụng annotation [Table] để ánh xạ tên bảng MySQL với tên lớp C#. Nếu bỏ qua điều này, có thể gây ra lỗi khó hiểu. Ví dụ, trong môi trường Windows, chương trình có thể hoạt động bình thường, nhưng khi triển khai lên máy chủ Ubuntu, bạn sẽ gặp lỗi:

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

Nguyên nhân là vì MySQL trên Linux phân biệt chữ hoa và chữ thường trong tên bảng. Do đó, nếu lớp C# sử dụng tên viết hoa (User) nhưng bảng MySQL lại có tên viết thường (user), thì sẽ xảy ra lỗi.

Context

Tạo một file ApplicationDbContext.cs trong thư mục Data hoặc Context. Ví dụ:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
namespace sunzhongwei.Data;

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

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

File Program.cs

Trong file Program.cs, hãy sử dụng chuỗi kết nối đã tạo trước đó để cấu hình AppDbContext:

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

Sử dụng trong Controller MVC

Ví dụ minh họa sử dụng AppDbContext trong Controller:

1
2
3
4
5
6
7
8
9
public class SomeController : Controller
{
    private readonly AppDbContext _context;

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

Nhờ đó, bạn có thể thực hiện các thao tác CRUD trên cơ sở dữ liệu một cách dễ dàng.

GlobalUsings.cs

Tạo một file GlobalUsings.cs tại thư mục gốc để khai báo các namespace cần thiết một cách toàn cục. Điều này giúp bạn không phải nhập từng namespace riêng lẻ ở mỗi file. Ví dụ:

1
2
3
global using Microsoft.EntityFrameworkCore;
global using sunzhongwei.Models;
global using sunzhongwei.Data;

Tài liệu

  • – Tuy nhiên tài liệu này chưa phù hợp với .NET 8 vì từ phiên bản 6 trở đi, Program.cs đã được rút gọn.
  • – Bạn có thể sử dụng công cụ dotnet-aspnet-codegenerator để tự động tạo các trang CRUD, rất tiện lợi. Hiện nay Microsoft khuyến khích sử dụng Razor thay thế MVC, dù Razor chưa giải quyết hoàn toàn các vấn đề liên quan đến API.
  • – Một ví dụ mẫu sử dụng .NET 8.
comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy