Příprava na přístup k SQL Server pomocí Entity Framework Core (databáze jako první)

Stránky aktualizovány :
Datum vytvoření stránky :

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ě.