Pregătiți-vă să accesați SQL Server utilizând Entity Framework Core (baza de date mai întâi)
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.