Felkészülés az SQL Server elérésére az Entity Framework Core használatával (adatbázis-első)

Oldal frissítve :
Oldal létrehozásának dátuma :

Működési környezet

Visual Studio
  • Visual Studio 2022
.HÁLÓ
  • .NET 8
Entity Framework Core
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* A fenti egy ellenőrzési környezet, de más verziókkal is működhet.

Először

Az Entity Framework Core az O/R leképezők könyvtára. Az adatbázis elérésekor az adatbázis rekordjait a kódban definiált modelleken (osztályokon) keresztül érheti el, anélkül, hogy közvetlenül SQL utasításokat használna. Ez a következő előnyökkel jár:

  • Mivel az SQL-utasítások nem közvetlenül íródnak, csökkennek az olyan biztonsági kockázatok, mint az SQL-injektálás.
  • Mivel az SQL-utasítások karakterláncok, még akkor is, ha hibát követ el a szintaxisban, a rendszer nem ellenőrzi a buildhibákat, de mivel a modell programszintaxis, a buildeléskor ellenőrizheti a hibákat.

Az Entity Framework Core automatikusan képes kódot generálni a meglévő adatbázisokból a modellekhez és adatbázisokhoz való csatlakozáshoz. Ezzel szemben lehetőség van a kód manuális írására, majd az adatbázis automatikus létrehozására.

Az előbbit "adatbázis-elsőnek", az utóbbit "kód-elsőnek" nevezik. Van még egy "model-first" is, amely kódot és adatbázisokat hoz létre olyan tervekből, mint az ER-diagramok, de nem használják széles körben az Entity Framework Core-ban.

Ebben az esetben egy "adatbázis-első" mintát fogunk használni, amely kódot generál azzal a feltételezéssel, hogy az adatbázis már létezik.

SQL Server telepítése

Az ebben a tippben található SQL Server adatbázis eléréséhez előre állítsa be az SQL Servert. Telepíthető PC-re a fejlesztői környezetben vagy egy másik számítógépen a hálózaton keresztül. Ha csatlakozni tud az SQL Serverhez a fejlesztői környezetből, akkor már mehet is. Ebben a tippben az SQL Server külön környezetben van telepítve.

Az SQL Server beállítási lépései kimaradnak, mert redundánsak. A következő oldalak SQL Serverrel kapcsolatos tippeket tartalmaznak, ezért ha tudni szeretné, hogyan állíthatja be, olvassa el azt.

Tábla létrehozása

Ezúttal a következő adatbázist és táblát hozzuk létre Mr./Ms. néven.

  • Adatbázis neve: TestDatabase
  • Tábla neve: Felhasználó
  • Táblaoszlopok: [ID], [Név], [Jelszó], [Életkor], [E-mail], [Születésnap], [UpdateDateTime]

Bármilyen módon létrehozhatja, de ha nem szeretné megtenni, futtassa a következő SQL-t SQL Server létrehozásához.

A következő az adatbázis létrehozása SQL, de mivel az adatbázis létrehozásának elérési útja a verziótól stb. függően változik, megbízhatóbb lehet grafikus felhasználói felülettel vagy paranccsal létrehozni SQL helyett.

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ábla létrehozása 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

Rekord SQL hozzáfűzése.

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

A Visual Studio telepítése

Feltételezzük, hogy ezt is beállította már. Ha tudni szeretné a beállítási eljárást stb., A következő oldalon összefoglaljuk.

Projekt létrehozása

Az Entity Framework Core nem függ semmilyen végrehajtási környezettől, így számos projektben használható. Ebben a cikkben az Entity Framework Core-t fogjuk használni egy egyszerű konzolalkalmazás-környezetben.

Az új projektben válassza a Konzolalkalmazás lehetőséget.

A projekt létrejött. Nem számít, mi a projekt neve.

Az Entity Framework Core csomag beszerzése

Szerezzen be egy csomagot az Entity Framework Core NuGet használatával való használatához.

Kattintson a jobb gombbal a függőségre, és válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.

A lapon válassza a "Tallózás" lehetőséget, és írja be a EntityFrameworkCore keresőmezőbe. Ezután látnia kell az Entity Framework Core-hoz kapcsolódó csomagokat a listában.

Mivel ezúttal az SQL Servert fogjuk használni, a következő csomagokat telepítjük.

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

Microsoft.EntityFrameworkCore Ebben a példában a . Telepítse a másik kettőt is.

Válassza ki a telepítési célt, majd kattintson a Telepítés gombra. A verzióhoz válassza ki a legújabb stabilt.

A párbeszédablak alapvetően OK, és rákattinthat OK.

Telepítse a másik kettőt is.

Azt hiszem, a csomag így néz ki:

Modell (kód) létrehozása adatbázistábla-struktúrából

A modell és más kód automatikus létrehozásához először hozza létre a projektet, hogy megbizonyosodjon arról, hogy nincsenek hibák. Hiba esetén a modell létrehozása sikertelen lesz. Ha már ellenőrizte, hogy nincsenek hibák, akkor nem kell létrehoznia.

A Visual Studióban nyissa meg a Csomagkezelő konzolt. Ha még nincs ilyen, megnyithatja azt az "Eszközök", "NuGet csomagkezelő", "Csomagkezelő konzol" menüből.

A következő ablak jelenik meg, ezért győződjön meg arról, hogy a jobb felső sarokban található "Alapértelmezett projekt" az a projekt, amelyhez modellt szeretne létrehozni. (Óvatosnak kell lennie, ha több projektje van)

Írja be a következő szöveget a beviteli mezőbe: A paraméterek a környezettől függően változnak, ezért kérjük, időben változtassa meg őket az alábbi magyarázatok szerint.

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

Példa bemenetre

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
Paraméter descriptionParaméter példa
Szolgáltató Az SQL Server esetében ez Microsoft.EntityFrameworkCore.SqlServer rögzített. Microsoft.EntityFrameworkCore.SqlServer
Kapcsolat Az adatbázishoz való csatlakozáshoz szükséges kapcsolati sztring. A kapcsolati sztringek más alkalmazásokkal közösen is használhatók, ezért kövesse a kapcsolati sztringek jelölését a megadni kívánt tartalomhoz. Használhatja a Windows-hitelesítést vagy az SQL Server-hitelesítést. Egyébként csak ideiglenesen használják modell létrehozására, így nem kell tisztában lennie a biztonsággal az alkalmazás közzététele után ehhez a kapcsolati sztringhez. Ha szimbólumok vannak a jelszavában, vigyázzon a menekülésre. "Adatforrás=kiszolgálónév\SQLEXPRESS; Adatbázis=TestDatabase; felhasználói azonosító=felhasználónév; password=**********"
f Még akkor is, ha a program már létezik, erőszakkal felülíródik. Nincs <>
OutputDir A mappa elérési útja, ahová a kódot ki szeretné adni. A projektmappához viszonyított elérési út Modellek\Adatbázis
Kontextus Környezetosztály-nevek az entitás-keretrendszer használatakor TestDatabaseDbContext
UseDatabaseNames Ha meg van adva, az adatbázis táblaneve az osztály neve lesz. Ha nincs megadva, az entitásosztály nevének kis- és nagybetűje a szabályoknak megfelelően módosul. Nincs <>
DataAnnotations Ha meg van adva, az oszloptípus automatikusan hozzáfűzi a DataAnnotation attribútumot az egyes tulajdonságokhoz. Ez egy kicsit hasznos, ha automatikusan szeretné végrehajtani a bemeneti ellenőrzéseket az adatbázis típusának megfelelően. Nincs <>
Namespace Az a névtér, amelyhez a létrehozott entitásosztály tartozik. Ha nincs megadva, a névtér meghatározása a mappának megfelelően történik. TestNamespace
ContextNamespace Az a névtér, amelyhez a létrehozott környezet tartozik. Ha nincs megadva, a névtér meghatározása a mappának megfelelően történik. TestNamespace
NoOnConfiguring Ne ágyazzon be nyers kapcsolati sztringeket a kódba. Nincs <>
NoPluralize Győződjön meg arról, hogy a környezetben az egyes táblanevek tulajdonságnevei nincsenek többes számban. Nincs <>

Amikor megnyomja az Enter billentyűt a futtatásához, a kód automatikusan létrejön: Ha hiba történik, az ok megjelenik, ezért kérjük, válaszoljon a hiba tartalmának megfelelően.

User A táblázat modellkódja a következő.

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

Egyébként a figyelmeztetés azért jelenik meg, mert a kapcsolati karakterlánc úgy van megírva, ahogy a létrehozott környezeti osztály kódjában van. Ha lehetséges, a kapcsolati karakterláncot külön helyen kell tárolni, és futásidőben kell beállítani, de ebben az esetben a művelet ellenőrzésére szolgál, ezért úgy hagyom, ahogy van.

Rekordok beolvasása és megjelenítése

Most, hogy megvan a kód az adatbázis rekordjainak eléréséhez, próbáljuk meg lekérni a rekordokat, és megjeleníteni őket a konzolon.

Program.cs és módosítsa azt az alábbiak szerint.

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

Hozza létre az automatikusan létrehozott DbContext osztályt new a mappában. Be van deklarálva, hogy az adatbázis-kapcsolatok automatikusan megsemmisíthetők legyenek using var .

dbContext Tulajdonságokat hoz létre az egyes modellek eléréséhez, így ebben az esetben User a tulajdonságok elérésével User módosíthatja a tábla rekordjait. A kiadott SQL automatikusan belsőleg jön létre, és nem kell észrevenni.

ToList Itt egy kiterjesztési metódussal lehet User lekérni a tábla összes rekordját.

foreach A többit az és JsonSerializer.Serialize metódusokkal végezzük az információk megjelenítésére User a konzolon. Ahogy User fentebb említettük, a táblázat minden oszlopa tulajdonságként van deklarálva, így az érték egyenként is lekérhető.