Chuẩn bị truy cập MySQL với Entity Framework Core (ưu tiên cơ sở dữ liệu)

Ngày tạo trang :

Môi trường xác nhận hoạt động

Visual Studio
  • Visual Studio 2022
.MẠNG
  • .NET 8
Entity Framework Core
  • Entity Framework Core 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

* Trên đây là môi trường xác minh, nhưng nó có thể hoạt động trong các phiên bản khác.

Lúc đầu

Entity Framework Core là một thư viện gồm các trình lập bản đồ O/R cho phép bạn truy cập các bản ghi cơ sở dữ liệu thông qua các mô hình (lớp) do mã xác định mà không cần trực tiếp viết các câu lệnh SQL khi truy cập cơ sở dữ liệu. Điều này mang lại những lợi ích sau:

  • Không viết trực tiếp các câu lệnh SQL, giảm rủi ro bảo mật như SQL injection
  • Vì các câu lệnh SQL là chuỗi, ngay cả khi chúng mắc lỗi trong cú pháp, chúng không phải là đối tượng kiểm tra lỗi xây dựng, nhưng vì mô hình là cú pháp chương trình nên nó có thể được kiểm tra lỗi tại thời điểm xây dựng.

Entity Framework Core tự động tạo mã để kết nối với các mô hình và cơ sở dữ liệu này từ cơ sở dữ liệu hiện có, Ngược lại, có một cách để viết mã theo cách thủ công và sau đó tự động tạo cơ sở dữ liệu.

Cái trước được gọi là "đầu tiên cơ sở dữ liệu" và cái sau được gọi là "đầu tiên mã". Ngoài ra còn có "model-first" tạo mã và cơ sở dữ liệu từ các bản thiết kế, chẳng hạn như sơ đồ ER, nhưng nó không được sử dụng rộng rãi trong Entity Framework Core.

Lần này, chúng ta sẽ sử dụng mô hình "cơ sở dữ liệu đầu tiên" tạo mã dựa trên giả định rằng cơ sở dữ liệu đã tồn tại.

Thiết lập MySQL

Trong mẹo này, hãy đảm bảo rằng bạn đã thiết lập MySQL trước để truy cập cơ sở dữ liệu MySQL của mình. Nó có thể được thiết lập trên PC trong môi trường phát triển của bạn hoặc trên PC khác qua mạng. Nếu bạn có thể kết nối với MySQL từ môi trường phát triển của mình, bạn đã sẵn sàng. Trong mẹo này, chúng tôi đã cài đặt MySQL trong một môi trường khác.

Các bước thiết lập MySQL sẽ bị bỏ qua vì chúng sẽ là dư thừa. Các trang sau đây chứa các mẹo liên quan đến MySQL cho các bước thiết lập.

Tạo bảng

Trong trường hợp này, chúng ta sẽ tạo lược đồ (cơ sở dữ liệu) và bảng sau làm mẫu.

  • Tên lược đồ : test_schema
  • Tên bảng: người dùng
  • Cột bảng: [id], [tên], [mật khẩu], [tuổi], [email], [sinh nhật], [is_provisional_registration], [update_datetime]

Không quan trọng bạn viết nó như thế nào, nhưng nếu nó tẻ nhạt, hãy chạy và tạo SQL sau chống lại MySQL:

Sau đây là SQL tạo lược đồ:

CREATE DATABASE `test_schema`;

Tạo bảng là SQL.

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `is_provisional_registration` tinyint(1) NOT NULL,
  `update_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';

Thêm bản ghi vào SQL.

INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');

Đặt quyền cho tài khoản của bạn

Đảm bảo rằng bạn đã thiết lập tên máy chủ để tài khoản bạn lập trình có thể truy cập lược đồ MySQL.

Bạn cũng cần đặt quyền truy test_schema cập vào tài khoản bạn muốn kết nối.

Lần này, chúng tôi sẽ thực hiện SELECT quá trình truy xuất hồ sơ. Lần này tôi sẽ không làm điều đó, nhưng nếu bạn INSERT UPDATE muốn chèn hoặc cập nhật, vui lòng kiểm tra và .

Thiết lập Visual Studio

Giả sử bạn cũng đã thiết lập nó. Nếu bạn muốn biết quy trình thiết lập, chúng tôi đã tóm tắt nó trên trang sau.

Tạo dự án

Entity Framework Core không phụ thuộc vào một môi trường thực thi cụ thể, vì vậy nó có thể được sử dụng trong nhiều dự án. Trong trường hợp này, chúng ta sẽ sử dụng Entity Framework Core trong một môi trường ứng dụng bảng điều khiển đơn giản.

Trong dự án mới, chọn Ứng dụng Bảng điều khiển (tùy theo điều kiện nào không phải là .NET Framework).

Bạn đã tạo dự án. Tên dự án có thể là bất cứ thứ gì.

Tải gói Entity Framework Core cho MySQL

Nhận gói để sử dụng Entity Framework Core với NuGet. Gói sử dụng: Đây không phải là chính thức từ Microsoft, nhưng nó được sử dụng rộng rãi.

  • Pomelo.EntityFrameworkCore.MySql

Nhấp chuột phải vào phần phụ thuộc và chọn Quản lý gói NuGet.

Với "Duyệt" được chọn từ tab, hãy nhập vào trường Pomelo tìm kiếm . Danh sách các gói liên quan sẽ được hiển thị.

Cài đặt các gói sau từ đây:

  • Pomelo.EntityFrameworkCore.MySql

Chọn những gì bạn muốn cài đặt và nhấp vào nút Cài đặt. Chọn phiên bản ổn định mới nhất cho phiên bản.

Hộp thoại về cơ bản là OK và ổn.

Tôi nghĩ gói như sau.

Sau đó, nhập vào EntityFrameworkCore trường tìm kiếm và cài đặt phần sau.

  • Microsoft.EntityFrameworkCore.Tools

Đối với các phiên bản, hãy Pomelo.EntityFrameworkCore.MySql khớp với phiên bản được tham chiếu Microsoft.EntityFrameworkCore bởi . Lần này chúng ta đang đề cập đến 8.0.2, vì vậy Microsoft.EntityFrameworkCore.Tools hãy biến nó thành 8.0.2. Gói này được sử dụng để tạo mã từ cơ sở dữ liệu.

Cuối cùng, nó sẽ trông như thế này:

Tạo mô hình (mã) từ cấu hình bảng cơ sở dữ liệu

Để mô hình và mã khác được tạo tự động, trước tiên bạn phải xây dựng dự án của mình để đảm bảo không có lỗi. Nếu có lỗi, mô hình sẽ bị lỗi. Nếu bạn đã xác minh rằng không có lỗi, bạn không cần phải xây dựng.

Mở Bảng điều khiển Trình quản lý gói từ Visual Studio. Nếu không, bạn có thể mở nó từ menu Công cụ, Trình quản lý gói NuGet và Bảng điều khiển Trình quản lý gói.

Bạn sẽ thấy một cửa sổ giống như cửa sổ bên dưới, vì vậy hãy đảm bảo rằng "Dự án mặc định" ở góc trên bên phải là dự án bạn muốn tạo mô hình. (Bạn cần cẩn thận nếu bạn có nhiều dự án)

Nhập văn bản sau vào trường nhập: Các thông số sẽ thay đổi tùy thuộc vào môi trường, vì vậy hãy thay đổi chúng kịp thời dựa trên các giải thích sau.

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Đầu vào Example

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Giải thích
tham số dụ về tham số
Cung cấp Nếu đó là Pomelo.EntityFrameworkCore.MySql MySQL, hãy chỉ định như. Pomelo.EntityFrameworkCore.MySql
Kết nối Đây là chuỗi kết nối để kết nối với cơ sở dữ liệu. Chuỗi kết nối có thể được sử dụng trong các ứng dụng khác, vì vậy vui lòng viết nội dung được chỉ định theo ký hiệu của chuỗi kết nối. Nhân tiện, nó chỉ được sử dụng tạm thời để tạo mô hình, vì vậy không cần phải lưu ý về bảo mật sau khi xuất bản ứng dụng cho chuỗi kết nối này. Nếu bạn có biểu tượng trong mật khẩu của mình, hãy cẩn thận về việc trốn thoát. "Máy chủ = Máy chủ kiểm tra; Cơ sở dữ liệu = test_schema; người dùng = người dùng thử nghiệm; mật khẩu = XXXXXXXX;"
f Buộc ghi đè ngay cả khi bạn đã có một chương trình. Không có <>
Đầu ra Đường dẫn thư mục để xuất mã. Đường dẫn tương đối từ thư mục dự án Mô hình \Cơ sở dữ liệu
Ngữ cảnh Tên lớp ngữ cảnh khi sử dụng Entity Framework TestDatabaseDbContext
UseDatabaseNames Nếu được chỉ định, tên bảng trong cơ sở dữ liệu sẽ là tên lớp như hiện tại. Nếu không, trường hợp của tên lớp thực thể được điều chỉnh theo quy tắc. Không có <>
Chú thích dữ liệu Nếu được chỉ định, loại cột sẽ tự động thêm thuộc tính DataAnnotation vào từng thuộc tính. Điều này hơi hữu ích nếu bạn muốn tự động thực hiện kiểm tra đầu vào theo loại cơ sở dữ liệu. Không có <>
Không gian tên Không gian tên mà lớp thực thể được tạo thuộc về. Nếu không được chỉ định, không gian tên được xác định theo thư mục. TestKhông gian tên
ContextNamespace Không gian tên mà Context được tạo ra thuộc về. Nếu không được chỉ định, không gian tên được xác định theo thư mục. TestKhông gian tên
NoOnCấu hình Tránh nhúng chuỗi kết nối thô vào mã của bạn. Không có <>
KhôngPluralize Tránh tên thuộc tính số nhiều của mỗi tên bảng trong Context. Không có <>

Nhấn Enter để chạy nó và tự động tạo mã: Nếu đó là một lỗi, lý do sẽ được hiển thị, vì vậy vui lòng trả lời theo nội dung của lỗi.

user Mã mô hình cho bảng trông như sau:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SetupMysqlDatabaseFirst.Models.Database;

/// <summary>
/// テストコメント
/// </summary>
public partial class user
{
  [Key]
  public int id { get; set; }

  [StringLength(20)]
  public string name { get; set; } = null!;

  [StringLength(20)]
  public string? password { get; set; }

  public int? age { get; set; }

  [StringLength(200)]
  public string? email { get; set; }

  public DateOnly? birthday { get; set; }

  public bool is_provisional_registration { get; set; }

  [Column(TypeName = "datetime")]
  public DateTime? update_datetime { get; set; }
}

Nhân tiện, cảnh báo được hiển thị vì chuỗi kết nối được viết như trong mã của lớp ngữ cảnh được tạo. Nếu có thể, chuỗi kết nối nên được lưu trữ ở một nơi riêng và được đặt trong thời gian chạy, nhưng lần này là nhằm mục đích kiểm tra hoạt động, vì vậy tôi sẽ để nguyên như vậy.

Nhận bản ghi và xem nó

Bây giờ bạn đã có mã để truy cập các bản ghi trong cơ sở dữ liệu, hãy thử lấy các bản ghi và hiển thị chúng trong bảng điều khiển.

Program.cs và sửa đổi nó như sau.

using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;

Console.WriteLine("Hello, World!");

// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();

// データベースから User 一覧を取得する
var users = dbContext.user.ToList();

// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
  Console.WriteLine(JsonSerializer.Serialize(user));
}

Tạo lớp được DbContext new tạo tự động bằng . Nó được khai báo để cho phép using var kết nối cơ sở dữ liệu được tự động phá hủy.

dbContext đã tạo các thuộc tính để truy cập từng mô hình, vì vậy lần user này bạn có thể thao tác với các bản ghi trong bảng bằng cách User truy cập các thuộc tính. Bạn không cần phải biết về SQL được phát hành vì nó được tạo tự động trong nội bộ.

ToList Ở đây chúng ta đang sử dụng user một phương thức mở rộng để lấy tất cả các bản ghi trong bảng.

foreach Sau đó, tôi sử dụng user các phương thức và JsonSerializer.Serialize để hiển thị thông tin trong bảng điều khiển. Như đã user đề cập ở trên, mỗi cột trong bảng được khai báo là một thuộc tính, vì vậy cũng có thể truy xuất giá trị riêng lẻ.