Chuẩn bị truy cập SQL Server bằng Entity Framework Core (ưu tiên cơ sở dữ liệu)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường hoạt động

Visual Studio
  • Visual Studio 2022
.MẠNG
  • .NET 8
Entity Framework Core
  • Khung thực thể Core 8.0
Máy chủ SQL
  • Máy chủ SQL 2022

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

Lúc đầu

Entity Framework Core là một thư viện của O/R mappers. Khi truy cập cơ sở dữ liệu, bạn có thể truy cập các bản ghi của cơ sở dữ liệu thông qua các mô hình (lớp) được xác định trong mã mà không cần sử dụng trực tiếp các câu lệnh SQL. Điều này cung cấp các lợi ích sau:

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

Entity Framework Core có thể tự động tạo mã từ các cơ sở dữ liệu hiện có để kết nối với các mô hình và cơ sở dữ liệu này. 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à "cơ sở dữ liệu đầu tiên" và cái sau được gọi là "mã đầu tiên". 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ế như sơ đồ ER, nhưng nó không được sử dụng rộng rãi trong Entity Framework Core.

Trong trường hợp này, chúng ta sẽ sử dụng mẫu "database-first" tạo mã dựa trên giả định rằng cơ sở dữ liệu đã tồn tại.

Thiết lập SQL Server

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

Các bước thiết lập SQL Server được bỏ qua vì chúng là dư thừa. Các trang sau đây chứa các mẹo liên quan đến SQL Server, vì vậy nếu bạn muốn biết cách thiết lập, vui lòng tham khảo.

Tạo bảng

Lần này, chúng ta sẽ tạo cơ sở dữ liệu và bảng sau với tư cách là Mr./Ms..

  • Tên cơ sở dữ liệu: TestDatabase
  • 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], [UpdateDateTime]

Bạn có thể tạo nó theo bất kỳ cách nào, nhưng nếu bạn không muốn làm điều đó, hãy chạy SQL sau đối với SQL Server để tạo nó.

Sau đây là SQL tạo cơ sở dữ liệu, nhưng vì đường dẫn tạo cơ sở dữ liệu thay đổi tùy thuộc vào phiên bản, v.v., nên có thể đáng tin cậy hơn khi tạo nó bằng GUI hoặc lệnh thay vì SQL.

USE [master]
GO
CREATE DATABASE [TestDatabase]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO
ALTER DATABASE [TestDatabase] SET COMPATIBILITY_LEVEL = 160
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [TestDatabase] SET ARITHABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [TestDatabase] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [TestDatabase] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [TestDatabase] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [TestDatabase] SET  DISABLE_BROKER 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [TestDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [TestDatabase] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [TestDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [TestDatabase] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [TestDatabase] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [TestDatabase] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [TestDatabase] SET RECOVERY FULL 
GO
ALTER DATABASE [TestDatabase] SET  MULTI_USER 
GO
ALTER DATABASE [TestDatabase] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [TestDatabase] SET DB_CHAINING OFF 
GO
ALTER DATABASE [TestDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [TestDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS 
GO
ALTER DATABASE [TestDatabase] SET DELAYED_DURABILITY = DISABLED 
GO
ALTER DATABASE [TestDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF  
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestDatabase', N'ON'
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)
GO
ALTER DATABASE [TestDatabase] SET  READ_WRITE 
GO

Tạo bảng SQL.

USE [TestDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User](
  [ID] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL,
  [Password] [nvarchar](20) NOT NULL,
  [Age] [int] NULL,
  [Email] [nvarchar](200) NULL,
  [Birthday] [date] NULL,
  [UpdateDateTime] [datetime2](7) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

Bản ghi nối thêm SQL.

USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO

Thiết lập Visual Studio

Chúng tôi giả định rằng bạn cũng đã thiết lập tính năng này. Nếu bạn muốn biết quy trình thiết lập, v.v., nó được tóm tắt trên trang sau.

Tạo dự án

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

Trong dự án mới, chọn Ứng dụng Bảng điều khiển.

Dự án đã được tạo ra. Không quan trọng tên dự án là gì.

Tải gói Entity Framework Core

Nhận gói để sử dụng Entity Framework Core với NuGet.

Nhấp chuột phải vào dependency và chọn Manage NuGet Packages.

Với "Duyệt" được chọn từ tab, hãy nhập vào EntityFrameworkCore trường tìm kiếm. Sau đó, bạn sẽ thấy các gói liên quan đến Entity Framework Core trong danh sách.

Vì chúng tôi sẽ sử dụng SQL Server lần này, chúng tôi sẽ cài đặt các gói sau.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore Trong ví dụ này, chúng tôi đang cài đặt . Cài đặt hai cái còn lại là tốt.

Chọn mục tiêu cài đặt và nhấp vào nút Cài đặt. Đối với phiên bản, chọn ổn định mới nhất.

Hộp thoại về cơ bản là OK và bạn có thể nhấp vào OK.

Cài đặt hai cái còn lại là tốt.

Tôi nghĩ rằng gói trông như thế này:

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

Để mô hình và mã khác được tạo tự động, trước tiên hãy xây dựng dự án để đảm bảo không có lỗi. Nếu có lỗi, việc tạo mô hình không thành công. 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 nó.

Từ Visual Studio, mở Bảng điều khiển Trình quản lý Gói. Nếu bạn chưa có, bạn có thể mở nó từ menu "Công cụ", "Trình quản lý gói NuGet", "Bảng điều khiển trình quản lý gói".

Cửa sổ sau sẽ được hiển thị, 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 mà 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ố thay đổi tùy thuộc vào môi trường, vì vậy vui lòng thay đổi chúng theo các giải thích sau một cách kịp thời.

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Ví dụ đầu vào

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=TestServer;Database=TestDatabase;user id=TestUser;password=pass;TrustServerCertificate=true" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Mô tả thông sốVí dụ tham số
Cung cấp Đối với SQL Server, nó Microsoft.EntityFrameworkCore.SqlServer là cố định. Microsoft.EntityFrameworkCore.SqlServer
Kết nối 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 chung với các ứng dụng khác, vì vậy vui lòng làm theo ký hiệu của chuỗi kết nối cho nội dung được chỉ định. Bạn có thể sử dụng Xác thực Windows hoặc Xác thực SQL Server. 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 biết 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ó ký hiệu trong mật khẩu của mình, hãy cẩn thận để thoát ra. "Nguồn dữ liệu = Tên máy chủ \ SQLEXPRESS; Cơ sở dữ liệu = TestDatabase; id người dùng = Tên người dùng; mật khẩu = **********"
f Ngay cả khi chương trình đã tồn tại, nó sẽ bị buộc phải ghi đè. Không <>
Đầu raDir Đường dẫn thư mục nơi bạn muốn xuất mã. Đường dẫn liên quan đến 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 khung thực thể TestDatabaseDbContext
UseDatabaseNames Nếu được chỉ định, tên bảng của cơ sở dữ liệu sẽ là tên lớp như hiện tại. Nếu không được chỉ định, trường hợp tên lớp thực thể được điều chỉnh theo quy tắc. Không <>
Chú thích dữ liệu Khi đượ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 <>
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. Không gian tên thử nghiệm
Không gian tên ContextName. Không gian tên mà Ngữ cảnh đượ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. Không gian tên thử nghiệm
NoOnCấu hình Không nhúng chuỗi kết nối thô vào mã của bạn. Không <>
NoPluralize Đảm bảo rằng tên thuộc tính cho mỗi tên bảng trong ngữ cảnh không bị số nhiều. Không <>

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

User Mã mô hình của bảng như sau.

using System.ComponentModel.DataAnnotations;

namespace SetupSqlServerDatabaseFirst.Models.Database;

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; } = null!;

  public int? Age { get; set; }

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

  public DateOnly? Birthday { get; set; }

  public DateTime? UpdateDateTime { 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 biệt và được đặt trong thời gian chạy, nhưng trong trường hợp này, nó nhằm mục đích kiểm tra hoạt động, vì vậy tôi sẽ để nguyên như vậy.

Thử truy xuất và hiển thị bản ghi

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

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

// See https://aka.ms/new-console-template for more information
using SetupSqlServerDatabaseFirst.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 new được tạo DbContext tự động trong . Nó được khai báo để các kết nối cơ sở dữ liệu có thể using var tự động bị hủy.

dbContext tạo ra các thuộc tính để truy cập vào từng mô hình, vì vậy trong trường hợp User này, bạn có thể thao tác các bản ghi trong bảng bằng cách User truy cập các thuộc tính. SQL được phát hành được tạo tự động nội bộ và không cần phải chú ý.

ToList Ở đây, một phương thức mở rộng được sử dụng để User truy xuất tất cả các bản ghi trong bảng.

foreach Phần còn lại được thực hiện bằng cách sử dụng các phương thức và JsonSerializer.Serialize để User hiển thị thông tin trên 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ó thể truy xuất giá trị riêng lẻ.