Felkészülés az SQL Server elérésére az Entity Framework Core használatával (adatbázis-első)
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ő.