Príprava na prístup k SQL Serveru pomocou Entity Framework Core (databáza)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prevádzkové prostredie

Visual Studio
  • Visual Studio 2022
.SIEŤ
  • .NET 8
Jadro rámca entít
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* Vyššie uvedené je overovacie prostredie, ale môže fungovať aj s inými verziami.

Najskôr

Entity Framework Core je knižnica O/R mapperov. Pri prístupe k databáze môžete pristupovať k záznamom databázy prostredníctvom modelov (tried) definovaných v kóde bez priameho použitia príkazov SQL. To poskytuje nasledujúce výhody:

  • Keďže príkazy SQL sa nepíšu priamo, bezpečnostné riziká, ako je injektáž SQL, sa znižujú.
  • Keďže príkazy SQL sú reťazce, aj keď urobíte chybu v syntaxi, nekontroluje sa chyba zostavenia, ale keďže model je syntax programu, môžete skontrolovať chyby v čase zostavovania.

Entity Framework Core môže automaticky generovať kód z existujúcich databáz na pripojenie k týmto modelom a databázam. Naopak, existuje spôsob, ako napísať kód manuálne a potom automaticky vygenerovať databázu.

Prvý sa nazýva "najprv databáza" a druhý sa nazýva "prvý kód". K dispozícii je tiež "model-first", ktorý generuje kód a databázy z plánov, ako sú ER diagramy, ale nie je široko používaný v Entity Framework Core.

V tomto prípade použijeme vzor "database-first", ktorý generuje kód za predpokladu, že databáza už existuje.

Nastavenie SQL Servera

Ak chcete získať prístup k databáze SQL Servera v tomto tipe, nastavte SQL Server vopred. Dá sa nastaviť na počítači vo vývojovom prostredí alebo na inom počítači cez sieť. Ak sa môžete pripojiť k SQL Serveru z vývojového prostredia, môžete začať. V tomto tipe je SQL Server nainštalovaný v samostatnom prostredí.

Kroky nastavenia SQL Servera sú vynechané, pretože sú nadbytočné. Nasledujúce stránky obsahujú tipy týkajúce sa SQL Servera, takže ak chcete vedieť, ako ho nastaviť, pozrite si ich.

Vytvorenie tabuľky

Tentokrát vytvoríme nasledujúcu databázu a tabuľku ako pán/pani.

  • Názov databázy: TestDatabase
  • Názov tabuľky: Používateľ
  • Stĺpce tabuľky: [ID], [Meno], [Heslo], [Vek], [E-mail], [Narodeniny], [UpdateDateTime]

Môžete ho vytvoriť akýmkoľvek spôsobom, ale ak to nechcete urobiť, spustite nasledujúci SQL server a vygenerujte ho.

Nasleduje vytváranie databázy SQL, ale keďže cesta k vytvoreniu databázy sa mení v závislosti od verzie atď., môže byť spoľahlivejšie vytvoriť ju pomocou GUI alebo príkazu namiesto 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áranie tabuliek 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 Pripojiť 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

Nastavenie Visual Studia

Predpokladáme, že ste to už tiež nastavili. Ak chcete poznať postup nastavenia atď., je to zhrnuté na nasledujúcej stránke.

Vytvorenie projektu

Entity Framework Core nie je závislý od žiadneho konkrétneho prostredia vykonávania, takže ho možno použiť v mnohých projektoch. V tomto článku použijeme Entity Framework Core v prostredí jednoduchej konzolovej aplikácie.

V novom projekte vyberte Aplikácia konzoly.

Projekt bol vytvorený. Nezáleží na tom, aký je názov projektu.

Získajte balík Entity Framework Core

Získajte balík na používanie Entity Framework Core s NuGetom.

Kliknite pravým tlačidlom myši na závislosť a vyberte položku Spravovať balíky NuGet.

Keď je na karte vybratá možnosť "Prehľadávať", zadajte do vyhľadávacieho poľa EntityFrameworkCore . V zozname by ste potom mali vidieť balíky súvisiace s Entity Framework Core.

Keďže tentoraz použijeme SQL Server, nainštalujeme nasledujúce balíky.

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

Microsoft.EntityFrameworkCore V tomto príklade inštalujeme . Nainštalujte aj ďalšie dva.

Vyberte cieľ inštalácie a kliknite na tlačidlo Inštalovať. Pre verziu vyberte najnovšiu stabilnú.

Dialógové okno je v podstate v poriadku a môžete kliknúť na tlačidlo OK.

Nainštalujte aj ďalšie dva.

Myslím si, že balík vyzerá takto:

Vytvorenie modelu (kódu) zo štruktúry databázovej tabuľky

Ak chcete, aby sa model a ďalší kód vygenerovali automaticky, najprv zostavte projekt, aby ste sa uistili, že neexistujú žiadne chyby. Ak sa vyskytne chyba, vytvorenie modelu zlyhá. Ak ste už overili, že sa nevyskytli žiadne chyby, nemusíte ho vytvárať.

V aplikácii Visual Studio otvorte konzolu Správca balíkov. Ak ho nemáte, môžete ho otvoriť z ponuky "Nástroje", "Správca balíkov NuGet", "Konzola správcu balíkov".

Zobrazí sa nasledujúce okno, preto sa uistite, že "Predvolený projekt" v pravom hornom rohu je projekt, pre ktorý chcete vytvoriť model. (Musíte byť opatrní, ak máte viacero projektov)

Do vstupného poľa zadajte nasledujúci text: Parametre sa menia v závislosti od prostredia, preto ich včas zmeňte podľa nasledujúcich vysvetlení.

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

Prí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 parametraPríklad parametra
Poskytovateľ Pre SQL Server je to Microsoft.EntityFrameworkCore.SqlServer pevné. Microsoft.EntityFrameworkCore.SqlServer
Pripojenie Reťazec pripojenia na pripojenie k databáze. Reťazce pripojenia možno používať spoločne s inými aplikáciami, preto postupujte podľa zápisu reťazcov pripojenia, aby ste mohli zadať obsah. Môžete použiť overenie systému Windows alebo overenie SQL Servera. Mimochodom, používa sa len dočasne na vytvorenie modelu, takže po zverejnení aplikácie pre tento reťazec pripojenia nie je potrebné uvedomovať si bezpečnosť. Ak máte v hesle symboly, dávajte pozor na únik. "Zdroj údajov=NázovServera\SQLEXPRESS; Databáza=TestDatabase; id používateľa=Používateľské meno; password=**********"
f Aj keď program už existuje, bude násilne prepísaný. Žiadne <>
Výstupný dir Cesta k priečinku, do ktorého chcete vypísať kód. Cesta relatívne k priečinku projektu Modely\Databáza
Kontext Názvy kontextových tried pri použití entity Framework TestDatabaseDbContext
UseDatabaseNames Ak je zadaný, názov tabuľky databázy bude názov triedy tak, ako je. Ak nie je zadaný, veľkosť písmen v názve triedy entity sa upraví podľa pravidiel. Žiadne <>
Dátové anotácie Ak je zadaný, typ stĺpca automaticky pripojí atribút DataAnnotation ku každej vlastnosti. To je trochu užitočné, ak chcete automaticky vykonávať vstupné kontroly podľa typu databázy. Žiadne <>
Menný priestor Priestor názvov, do ktorého patrí vygenerovaná trieda entít. Ak nie je zadaný, priestor názvov sa určí podľa priečinka. TestNamespace
Kontextový priestor názvov Priestor názvov, do ktorého patrí vygenerovaný kontext. Ak nie je zadaný, priestor názvov sa určí podľa priečinka. TestNamespace
NoOnKonfigurácia Do kódu nevkladajte nespracované reťazce pripojenia. Žiadne <>
NoPluralize Uistite sa, že názvy vlastností pre každý názov tabuľky v kontexte nie sú v množnom čísle. Žiadne <>

Keď ho spustíte stlačením klávesu Enter, kód sa vygeneruje automaticky: Ak sa vyskytne chyba, zobrazí sa dôvod, preto odpovedzte podľa obsahu chyby.

User Kód modelu tabuľky je nasledovný.

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

Mimochodom, upozornenie sa zobrazí, pretože reťazec pripojenia je zapísaný tak, ako je v kóde vygenerovanej triedy kontextu. Ak je to možné, pripojovací reťazec by mal byť uložený na samostatnom mieste a nastavený za behu, ale v tomto prípade je to za účelom kontroly operácie, takže ho nechám tak, ako je.

Skúste načítať a zobraziť záznamy

Teraz, keď máme kód na prístup k záznamom v databáze, skúsme záznamy načítať a zobraziť ich na konzole.

Program.cs a upravte ho nasledovne.

// 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 vygenerovanú DbContext triedu new v rozhraní . Deklaruje sa in, aby bolo možné using var automaticky zničiť pripojenia k databáze.

dbContext generuje vlastnosti na prístup ku každému modelu, takže v tomto prípade User môžete manipulovať so záznamami v tabuľke prístupom User k vlastnostiam. Vydané SQL sa automaticky generuje interne a nie je potrebné si ho všímať.

ToList Tu sa používa metóda rozšírenia na User načítanie všetkých záznamov v tabuľke.

foreach Zvyšok sa vykonáva pomocou metód a JsonSerializer.Serialize na User zobrazenie informácií na konzole. Ako User už bolo spomenuté vyššie, každý stĺpec v tabuľke je deklarovaný ako vlastnosť, takže je možné načítať hodnotu jednotlivo.