Pregătiți-vă să accesați SQL Server utilizând Entity Framework Core (baza de date mai întâi)

Pagina actualizată :
Data creării paginii :

Mediu de operare

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8
Nucleul cadrului entității
  • Cadrul de entitate Core 8.0
SQL Server
  • SQL Server 2022

* Cele de mai sus sunt un mediu de verificare, dar pot funcționa cu alte versiuni.

La început

Entity Framework Core este o bibliotecă de cartografi O/R. Când accesați baza de date, puteți accesa înregistrările bazei de date prin modele (clase) definite în cod, fără a utiliza direct instrucțiuni SQL. Aceasta oferă următoarele avantaje:

  • Deoarece instrucțiunile SQL nu sunt scrise direct, riscurile de securitate, cum ar fi injecția SQL, sunt reduse.
  • Deoarece instrucțiunile SQL sunt șiruri de caractere, chiar dacă faceți o greșeală în sintaxă, nu este verificată erorile de construire, dar deoarece modelul este o sintaxă a programului, puteți verifica greșelile la momentul construirii.

Entity Framework Core poate genera automat cod din bazele de date existente pentru a se conecta la aceste modele și baze de date. În schimb, există o modalitate de a scrie codul manual și apoi de a genera automat baza de date.

Primul se numește "database-first", iar cel de-al doilea se numește "code-first". Există, de asemenea, "model-first", care generează cod și baze de date din planuri precum diagramele ER, dar nu este utilizat pe scară largă în Entity Framework Core.

În acest caz, vom folosi un model "baza de date mai întâi" care generează cod presupunând că baza de date există deja.

Instalare SQL Server

Pentru a accesa baza de date SQL Server din acest sfat, vă rugăm să configurați SQL Server în avans. Poate fi configurat pe un PC în mediul de dezvoltare sau pe un alt PC prin rețea. Dacă vă puteți conecta la SQL Server din mediul de dezvoltare, sunteți gata. În acest sfat, SQL Server este instalat într-un mediu separat.

Pașii de instalare SQL Server sunt omise, deoarece acestea sunt redundante. Următoarele pagini conțin sfaturi legate de SQL Server, deci dacă doriți să știți cum să îl configurați, vă rugăm să îl consultați.

Crearea unui tabel

De data aceasta, vom crea următoarea bază de date și tabel ca domn / doamnă.

  • Numele bazei de date: TestDatabase
  • Numele tabelului: Utilizator
  • Coloanele tabelului: [ID], [Nume], [Parolă], [Vârstă], [E-mail], [Zi de naștere], [UpdateDateTime]

Puteți să-l creați în orice mod, dar dacă nu doriți să o faceți, executați următorul SQL împotriva SQL Server pentru a-l genera.

Următoarea este crearea bazei de date SQL, dar din moment ce calea de creare a bazei de date se modifică în funcție de versiune etc., poate fi mai fiabil să o creați cu GUI sau comandă în loc de 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

Crearea tabelului 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

Înregistrați Adăugare 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

Visual Studio Setup

Presupunem că ați configurat deja și acest lucru. Dacă doriți să cunoașteți procedura de configurare etc., aceasta este rezumată pe pagina următoare.

Crearea unui proiect

Entity Framework Core nu depinde de un anumit mediu de execuție, deci poate fi utilizat în multe proiecte. În acest articol, vom utiliza Entity Framework Core într-un mediu simplu de aplicații consolă.

În noul proiect, selectați Aplicația Consolă.

Proiectul a fost creat. Nu contează care este numele proiectului.

Obțineți pachetul Entity Framework Core

Obțineți un pachet pentru utilizarea Entity Framework Core cu NuGet.

Faceți clic dreapta pe dependență și selectați Gestionare pachete NuGet.

Cu "Răsfoiți" selectat din filă, introduceți în câmpul de EntityFrameworkCore căutare. Apoi, ar trebui să vedeți pachetele legate de Entity Framework Core în listă.

Deoarece vom folosi SQL Server de data aceasta, vom instala următoarele pachete.

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

Microsoft.EntityFrameworkCore În acest exemplu, instalăm . Instalați și celelalte două.

Selectați ținta de instalare și faceți clic pe butonul Instalare. Pentru versiune, selectați cel mai recent stabil.

Dialogul este practic OK și puteți face clic pe OK.

Instalați și celelalte două.

Cred că pachetul arată astfel:

Crearea unui model (cod) dintr-o structură de tabel bază de date

Pentru ca modelul și alt cod să fie generate automat, construiți mai întâi proiectul pentru a vă asigura că nu există erori. Dacă există o eroare, crearea modelului nu reușește. Dacă ați verificat deja că nu există erori, nu trebuie să o construiți.

Din Visual Studio, deschideți consola Manager pachete. Dacă nu aveți unul, îl puteți deschide din meniul "Instrumente", "NuGet Package Manager", "Package Manager Console".

Va fi afișată următoarea fereastră, deci asigurați-vă că "Proiectul implicit" din colțul din dreapta sus este proiectul pentru care doriți să creați un model. (Trebuie să fii atent dacă ai mai multe proiecte)

Introduceți următorul text în câmpul de introducere: Parametrii se modifică în funcție de mediu, așa că vă rugăm să îi modificați în timp util conform următoarelor explicații.

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

Exemplu de intrare

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
Descrierea parametrilorExemplu de parametru
Furnizor Pentru SQL Server, este Microsoft.EntityFrameworkCore.SqlServer fix. Microsoft.EntityFrameworkCore.SqlServer
Conexiune Șirul de conexiune pentru conectarea la baza de date. Șirurile de conexiune pot fi utilizate în comun cu alte aplicații, așa că vă rugăm să urmați notația șirurilor de conexiune pentru conținutul care urmează să fie specificat. Puteți utiliza autentificarea Windows sau autentificarea SQL Server. Apropo, este folosit doar temporar pentru a crea un model, deci nu este nevoie să fiți conștienți de securitate după publicarea aplicației pentru acest șir de conexiune. Dacă aveți simboluri în parolă, aveți grijă să nu scăpați. "Sursa datelor=Numeserver\SQLEXPRESS; Bază de date=TestDatabase; id utilizator = Nume utilizator; parola=**********"
f Chiar dacă programul există deja, acesta va fi suprascris forțat. Fără <>
OutputDir Calea folderului în care doriți să scoateți codul. Cale relativă la folderul proiectului Modele\Bază de date
Context Numele claselor contextuale atunci când utilizați cadrul de entitate TestDatabaseDbContext
UseDatabaseNames Dacă este specificat, numele tabelului bazei de date va fi numele clasei așa cum este. Dacă nu este specificat, cazul denumirii clasei de entitate este ajustat în conformitate cu regulile. Fără <>
DataAdnotări Când este specificat, tipul de coloană adaugă automat atributul DataAnnotation fiecărei proprietăți. Acest lucru este puțin util dacă doriți să efectuați automat verificări de intrare în funcție de tipul de bază de date. Fără <>
Spațiu de nume Spațiul de nume căruia îi aparține clasa entității generate. Dacă nu este specificat, spațiul de nume este determinat în funcție de folder. Spațiu de nume test
ContextNamespace Spațiul de nume căruia îi aparține contextul generat. Dacă nu este specificat, spațiul de nume este determinat în funcție de folder. Spațiu de nume test
NoOnConfiguring Nu încorporați șiruri de conexiune brute în codul dvs. Fără <>
NoPluralize Asigurați-vă că numele proprietăților pentru fiecare nume de tabel din context nu sunt pluralizate. Fără <>

Când apăsați Enter pentru a-l rula, codul este generat automat: Dacă apare o eroare, motivul va fi afișat, așa că vă rugăm să răspundeți în funcție de conținutul erorii.

User Codul modelului tabelului este următorul.

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; }
}

Apropo, avertismentul este afișat deoarece șirul de conexiune este scris așa cum este în codul clasei de context generate. Dacă este posibil, șirul de conectare trebuie stocat într-un loc separat și setat în timpul rulării, dar în acest caz, este în scopul verificării operației, așa că îl voi lăsa așa cum este.

Încercați să regăsiți și să afișați înregistrări

Acum că avem codul pentru a accesa înregistrările din baza de date, să încercăm să preluăm înregistrările și să le afișăm pe consolă.

Program.cs și modificați-l după cum urmează.

// 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));
}

Generați clasa new generată DbContext automat în . Este declarat astfel încât conexiunile bazei de date să poată using var fi distruse automat.

dbContext generează proprietăți pentru a accesa fiecare model, deci în acest caz User , puteți manipula înregistrările din tabel accesând User proprietățile. SQL care este emis este generat automat intern și nu trebuie să fie observat.

ToList Aici, o metodă de extensie este utilizată pentru a prelua User toate înregistrările din tabel.

foreach Restul se face folosind metodele și JsonSerializer.Serialize pentru a User afișa informațiile pe consolă. După cum User sa menționat mai sus, fiecare coloană din tabel este declarată ca proprietate, astfel încât este posibilă recuperarea valorii individual.