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.MySql và MySql.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:
|
|
Sau khi cài đặt xong, file cấu hình xxx.proj
sẽ thêm dòng sau:
|
|
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.json
và appsettings.json
, tương ứng cho môi trường phát triển và sản phẩm. Ví dụ:
|
|
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ụ:
|
|
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ụ:
|
|
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
:
|
|
Sử dụng trong Controller MVC
Ví dụ minh họa sử dụng AppDbContext
trong Controller:
|
|
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ụ:
|
|
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.