Příprava na přístup k SQL Server pomocí Entity Framework Core (databáze jako první)
Provozní prostředí
- Visual Studio
-
- Visual Studio 2022
- .SÍŤ
-
- .NET 8
- Jádro Entity Framework
-
- Entity Framework Core 8.0
- SQL Server
-
- SQL Server 2022
* Výše uvedené je ověřovací prostředí, ale může fungovat i s jinými verzemi.
Nejprve
Entity Framework Core je knihovna mapovačů O/R. Při přístupu k databázi můžete přistupovat k záznamům databáze prostřednictvím modelů (tříd) definovaných v kódu, aniž byste museli přímo používat příkazy SQL. To poskytuje následující výhody:
- Vzhledem k tomu, že příkazy SQL se nezapisují přímo, snižují se bezpečnostní rizika, jako je injektáž SQL.
- Vzhledem k tomu, že příkazy SQL jsou řetězce, i když uděláte chybu v syntaxi, nekontroluje se na chyby sestavení, ale vzhledem k tomu, že model je syntaxí programu, můžete zkontrolovat chyby v době sestavení.
Entity Framework Core může automaticky generovat kód z existujících databází pro připojení k těmto modelům a databázím. Naopak existuje způsob, jak kód napsat ručně a poté automaticky vygenerovat databázi.
První z nich se nazývá "database-first" a druhý se nazývá "code-first". K dispozici je také "model-first", který generuje kód a databáze z podrobných plánů, jako jsou diagramy ER, ale v Entity Framework Core se příliš nepoužívá.
V tomto případě použijeme vzor "database-first", který generuje kód za předpokladu, že databáze již existuje.
Instalace SQL Serveru
Chcete-li získat přístup k databázi SQL Server v tomto tipu, nastavte si prosím SQL Server předem. Lze jej nastavit na PC ve vývojovém prostředí nebo na jiném PC přes síť. Pokud se můžete připojit k SQL Server z vývojového prostředí, můžete začít. V tomto tipu je SQL Server nainstalovaný v samostatném prostředí.
Kroky nastavení SQL Server jsou vynechány, protože jsou redundantní. Následující stránky obsahují tipy týkající se SQL Serveru, takže pokud chcete vědět, jak jej nastavit, přečtěte si je.
Vytvoření tabulky
Tentokrát vytvoříme následující databázi a tabulku jako Pan/Paní.
- Název databáze: TestDatabase
- Název tabulky: User
- Sloupce tabulky: [ID], [Jméno], [Heslo], [Věk], [E-mail], [Narozeniny], [UpdateDateTime]
Můžete ho vytvořit libovolným způsobem, ale pokud to nechcete dělat, spusťte následující SQL proti SQL Server a vygenerujte ho.
Následuje vytvoření databáze SQL, ale protože cesta k vytvoření databáze se mění v závislosti na verzi atd., může být spolehlivější ji vytvořit pomocí GUI nebo příkazu místo 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
Vytváření tabulek 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
Záznam Připojit 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
Nastavení sady Visual Studio
Předpokládáme, že jste to již také nastavili. Pokud chcete znát postup nastavení atd., je to shrnuto na následující stránce.
Vytvoření projektu
Entity Framework Core není závislý na žádném konkrétním spouštěcím prostředí, takže ho lze použít v mnoha projektech. V tomto článku použijeme Entity Framework Core v jednoduchém prostředí konzolové aplikace.
V novém projektu vyberte Konzolová aplikace.
Projekt byl vytvořen. Nezáleží na tom, jak se projekt jmenuje.
Získání balíčku Entity Framework Core
Získejte balíček pro použití Entity Framework Core s NuGet.
Klikněte pravým tlačítkem na závislost a vyberte Spravovat balíčky NuGet.
Na kartě je vybráno "Procházet" a zadejte jej do EntityFrameworkCore
vyhledávacího pole. V seznamu by se pak měly zobrazit balíčky související s Entity Framework Core.
Vzhledem k tomu, že tentokrát budeme používat SQL Server, nainstalujeme následující balíčky.
- EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
V tomto příkladu instalujeme program . Nainstalujte také další dva.
Vyberte cíl instalace a klikněte na tlačítko Instalovat. Jako verzi vyberte nejnovější stabilitu.
Dialogové okno je v podstatě OK a můžete kliknout na OK.
Nainstalujte také další dva.
Myslím, že balíček vypadá takto:
Vytvoření modelu (kódu) ze struktury databázové tabulky
Chcete-li, aby se model a další kód automaticky vygenerovaly, nejprve sestavte projekt, abyste se ujistili, že nedochází k žádným chybám. Pokud dojde k chybě, vytvoření modelu se nezdaří. Pokud jste si už ověřili, že tam nejsou žádné chyby, nemusíte ho vytvářet.
V aplikaci Visual Studio otevřete konzolu Správce balíčků. Pokud ho nemáte, můžete jej otevřít z nabídky "Nástroje", "Správce balíčků NuGet", "Konzola správce balíčků".
Zobrazí se následující okno, proto se ujistěte, že "Výchozí projekt" v pravém horním rohu je projekt, pro který chcete vytvořit model. (Pokud máte více projektů, musíte být opatrní)
Do vstupního pole zadejte následující text: Parametry se mění v závislosti na prostředí, proto je prosím včas změňte podle následujících vysvětlení.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Příklad vstupu
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
Popis | parametruPříklad parametru | |
---|---|---|
Poskytovatel | Pro SQL Server je to Microsoft.EntityFrameworkCore.SqlServer pevné. |
Microsoft.EntityFrameworkCore.SqlServer |
Připojení | Připojovací řetězec pro připojení k databázi. Připojovací řetězce je možné použít společně s jinými aplikacemi, proto postupujte podle zápisu připojovacích řetězců pro obsah, který se má zadat. Můžete použít ověřování systému Windows nebo ověřování SQL Server. Mimochodem, používá se pouze dočasně k vytvoření modelu, takže po publikování aplikace pro tento připojovací řetězec není nutné si být vědom zabezpečení. Pokud máte v hesle symboly, dejte si pozor na únik. | "Zdroj dat=ServerName\SQLEXPRESS; Databáze=TestDatabase; id uživatele=Uživatelské_jméno; password=**********" |
f | I když program již existuje, bude násilně přepsán. | Žádné <> |
OutputDir (Adresář výstupu) | Cesta ke složce, do které chcete kód vyslat. Cesta relativní ke složce projektu | Modely\Databáze |
Kontext | Názvy tříd kontextu při použití Entity Framework | TestDatabaseDbContext |
UseDatabaseNames (Názvy databází) | Pokud je zadaný, název tabulky databáze bude název třídy tak, jak je. Není-li uvedeno, velikost písmen v názvu třídy entity se upraví podle pravidel. | Žádné <> |
Datové anotace | Pokud je zadán, typ sloupce automaticky připojí atribut DataAnnotation ke každé vlastnosti. To je trochu užitečné, pokud chcete automaticky provádět vstupní kontroly podle typu databáze. | Žádné <> |
Namespace | Obor názvů, do kterého patří vygenerovaná třída entity. Pokud není zadaný, obor názvů se určí podle složky. | TestNamespace (Jmenný prostor) |
ContextNamespace (Kontextový obor názvů) | Obor názvů, do kterého patří vygenerovaný Context. Pokud není zadaný, obor názvů se určí podle složky. | TestNamespace (Jmenný prostor) |
NoOnKonfigurace | Nevkládejte do kódu nezpracované připojovací řetězce. | Žádné <> |
NoPluralize (Nemnožné číslo) | Ujistěte se, že názvy vlastností pro každý název tabulky v kontextu nejsou v množném čísle. | Žádné <> |
Když stisknete klávesu Enter pro jeho spuštění, kód se automaticky vygeneruje: Pokud dojde k chybě, zobrazí se důvod, proto prosím odpovězte podle obsahu chyby.
User
Kód modelu tabulky je následující.
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; }
}
Mimochodem, upozornění se zobrazí, protože připojovací řetězec je zapsán tak, jak je v kódu vygenerované kontextové třídy. Pokud je to možné, měl by být připojovací řetězec uložen na samostatném místě a nastaven za běhu, ale v tomto případě je to za účelem kontroly operace, takže to nechám tak, jak to je.
Zkuste načíst a zobrazit záznamy
Teď, když máme kód pro přístup k záznamům v databázi, zkusme záznamy načíst a zobrazit je na konzole.
Program.cs
a upravte jej následujícím způsobem.
// 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));
}
Vygenerujte automaticky generovanou DbContext
třídu new
v . Je deklarován v tak, aby databázová připojení mohla using var
být automaticky zničena.
dbContext
Generuje vlastnosti pro přístup ke každému modelu, takže v tomto případě User
můžete manipulovat se záznamy v tabulce pomocí User
přístupu k vlastnostem.
Vydaný SQL je automaticky generován interně a není třeba si ho všímat.
ToList
Zde se k načtení všech záznamů v tabulce používá User
metoda rozšíření.
foreach
Zbytek se provádí pomocí metod and JsonSerializer.Serialize
pro User
zobrazení informací na konzole.
Jak User
již bylo zmíněno výše, každý sloupec v tabulce je deklarován jako vlastnost, takže je možné načíst hodnotu jednotlivě.