Priprava na dostop do strežnika SQL Server s programom Entity Framework Core (najprej z bazo podatkov)

Stran posodobljena :
Datum ustvarjanja strani :

Delovno okolje

Visual Studio
  • Visual Studio 2022
.MREŽA
  • .NET 8
Jedro ogrodja entitet
  • Jedro ogrodja entitet 8.0
SQL Server
  • SQL Server 2022

* Zgoraj navedeno je okolje za preverjanje, vendar lahko deluje z drugimi različicami.

Sprva

Entity Framework Core je knjižnica O/R kartografov. Pri dostopu do baze podatkov lahko dostopate do zapisov baze podatkov prek modelov (razredov), določenih v kodi, brez neposredne uporabe SQL izjav. To zagotavlja naslednje prednosti:

  • Ker se izjave SQL ne pišejo neposredno, se zmanjšajo varnostna tveganja, kot je vbrizgavanje SQL.
  • Ker so izjave SQL nizi, tudi če naredite napako v sintaksi, se ne preveri za napake pri gradnji, ker pa je model sintaksa programa, lahko preverite, ali so napake v času gradnje.

Entity Framework Core lahko samodejno ustvari kodo iz obstoječih zbirk podatkov za povezavo s temi modeli in zbirkami podatkov. Nasprotno pa obstaja način, da kodo napišete ročno in nato samodejno ustvarite bazo podatkov.

Prvi se imenuje »najprej baza podatkov«, drugi pa »najprej koda«. Obstaja tudi "model-first", ki ustvarja kodo in baze podatkov iz načrtov, kot so diagrami ER, vendar se v Entity Framework Core ne uporablja pogosto.

V tem primeru bomo uporabili vzorec »najprej baza podatkov«, ki generira kodo ob predpostavki, da baza podatkov že obstaja.

Nastavitev strežnika SQL Server

Če želite dostopati do zbirke podatkov strežnika SQL Server v tem nasvetu, vnaprej nastavite strežnik SQL Server. Lahko ga nastavite na računalniku v razvojnem okolju ali na drugem računalniku prek omrežja. Če se lahko povežete s strežnikom SQL Server iz razvojnega okolja, ste pripravljeni. V tem nasvetu je SQL Server nameščen v ločenem okolju.

Koraki namestitve strežnika SQL Server so izpuščeni, ker so odvečni. Naslednje strani vsebujejo nasvete, povezane s strežnikom SQL Server, zato če želite vedeti, kako ga nastaviti, si jih oglejte.

Ustvarjanje tabele

Tokrat bomo ustvarili naslednjo bazo podatkov in tabelo kot gospod / gospa.

  • Ime zbirke podatkov: TestDatabase
  • Ime tabele: Uporabnik
  • Stolpci tabele: [ID], [Ime], [Geslo], [Starost], [E-pošta], [Rojstni dan], [UpdateDateTime]

Ustvarite ga lahko na kakršen koli način, če pa tega ne želite storiti, zaženite naslednji SQL proti strežniku SQL Server, da ga ustvarite.

Sledi ustvarjanje baze podatkov SQL, vendar ker se pot ustvarjanja baze podatkov spreminja glede na različico itd., Je morda bolj zanesljivo, da jo ustvarite z GUI ali ukazom namesto 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

Ustvarjanje tabele 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

Zapis Dodajte 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

Nastavitev programa Visual Studio

Predvidevamo, da ste tudi to že nastavili. Če želite vedeti postopek namestitve itd., Je povzet na naslednji strani.

Ustvarjanje projekta

Entity Framework Core ni odvisen od nobenega določenega izvedbenega okolja, zato ga je mogoče uporabiti v številnih projektih. V tem članku bomo uporabili Entity Framework Core v preprostem aplikacijskem okolju konzole.

V novem projektu izberite Konzolna aplikacija.

Projekt je bil ustvarjen. Ni pomembno, kakšno je ime projekta.

Pridobite osnovni paket Entity Framework

Pridobite paket za uporabo Entity Framework Core z NuGetom.

Z desno tipko miške kliknite odvisnost in izberite Upravljanje paketov NuGet.

Ko je na zavihku izbran »Prebrskaj«, vnesite v iskalno EntityFrameworkCore polje. Nato bi morali na seznamu videti pakete, povezane z jedrom Entity Framework.

Ker bomo tokrat uporabili SQL Server, bomo namestili naslednje pakete.

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

Microsoft.EntityFrameworkCore V tem primeru nameščamo . Namestite tudi druga dva.

Izberite cilj namestitve in kliknite gumb Namesti. Za različico izberite najnovejšo stabilno.

Pogovorno okno je v bistvu v redu in lahko kliknete V redu.

Namestite tudi druga dva.

Mislim, da je paket videti takole:

Ustvarjanje modela (kode) iz strukture tabele zbirke podatkov

Če želite, da se model in druga koda samodejno ustvarita, najprej zgradite projekt in se prepričajte, da ni napak. Če pride do napake, ustvarjanje modela ne uspe. Če ste že preverili, da ni napak, vam ga ni treba ustvariti.

V programu Visual Studio odprite konzolo upravitelja paketov. Če ga nimate, ga lahko odprete v meniju »Orodja«, »Upravitelj paketov NuGet«, »Konzola upravitelja paketov«.

Prikaže se naslednje okno, zato se prepričajte, da je »Privzeti projekt« v zgornjem desnem kotu projekt, za katerega želite ustvariti model. (Bodite previdni, če imate več projektov)

V vnosno polje vnesite naslednje besedilo: Parametri se spreminjajo glede na okolje, zato jih prosimo, da jih pravočasno spremenite v skladu z naslednjimi pojasnili.

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

Primer vnosa

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
Opis parametraPrimer parametra
Ponudnik Za strežnik SQL Server je to Microsoft.EntityFrameworkCore.SqlServer fiksno. Microsoft.EntityFrameworkCore.SqlServer
Povezava Niz povezave za povezavo z zbirko podatkov. Povezovalni nizi se lahko uporabljajo skupaj z drugimi aplikacijami, zato upoštevajte zapis povezovalnih nizov za vsebino, ki jo želite določiti. Uporabite lahko preverjanje pristnosti sistema Windows ali preverjanje pristnosti strežnika SQL Server. Mimogrede, uporablja se le začasno za ustvarjanje modela, zato se po objavi aplikacije za ta povezovalni niz ni treba zavedati varnosti. Če imate v geslu simbole, bodite previdni pri pobegu. "Vir podatkov=Ime strežnika\SQLEXPRESS; Database=TestDatabase; id uporabnika = uporabniško ime; password=**********"
f Tudi če program že obstaja, bo prisilno prepisan. Ni <>
Izhodni dir Pot do mape, v katero želite izpisati kodo. Pot glede na mapo projekta Modeli\Baza podatkov
Kontekstu Imena razredov konteksta pri uporabi ogrodja entitete TestDatabaseDbContext
UseDatabaseNames Če je določeno, bo ime tabele zbirke podatkov ime razreda, kot je. Če ni določeno, se velika in mala črka imena razreda entitet prilagodi v skladu s pravili. Ni <>
Opombe podatkov Ko je določena, vrsta stolpca samodejno doda atribut DataAnnotation vsaki lastnosti. To je nekoliko uporabno, če želite samodejno izvajati preverjanje vnosa glede na vrsto baze podatkov. Ni <>
Imenski prostor Imenski prostor, v katerega spada ustvarjeni razred entitete. Če ni navedeno, je imenski prostor določen glede na mapo. TestImenski prostor
Kontekstni imenski prostor Imenski prostor, ki mu pripada ustvarjeni kontekst. Če ni navedeno, je imenski prostor določen glede na mapo. TestImenski prostor
NoOnConfiguring V kodo ne vdelajte neobdelanih nizov povezave. Ni <>
Brez množine Prepričajte se, da imena lastnosti za vsako ime tabele v kontekstu niso množina. Ni <>

Ko pritisnete Enter, da ga zaženete, se koda samodejno ustvari: Če pride do napake, bo prikazan razlog, zato se odzovete glede na vsebino napake.

User Koda modela tabele je naslednja.

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

Mimogrede, opozorilo je prikazano, ker je niz povezave zapisan tako, kot je v kodi ustvarjenega razreda konteksta. Če je mogoče, je treba povezovalni niz shraniti na ločenem mestu in nastaviti v času izvajanja, vendar je v tem primeru namenjen preverjanju operacije, zato ga bom pustil takšnega, kot je.

Poskusite pridobiti in prikazati zapise

Zdaj, ko imamo kodo za dostop do zapisov v bazi podatkov, poskusimo pridobiti zapise in jih prikazati na konzoli.

Program.cs in ga spremenite na naslednji način.

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

Ustvarite samodejno ustvarjen DbContext razred new v . Deklariran je tako, da se lahko povezave using var z bazo podatkov samodejno uničijo.

dbContext Ustvari lastnosti za dostop do vsakega modela, tako da lahko v tem primeru User manipulirate z zapisi v tabeli z dostopom do User lastnosti. Izdani SQL se samodejno ustvari interno in ga ni treba opaziti.

ToList Tukaj se uporablja razširitvena metoda za User pridobivanje vseh zapisov v tabeli.

foreach Ostalo se izvede z metodami in JsonSerializer.Serialize za User prikaz informacij na konzoli. Kot User je navedeno zgoraj, je vsak stolpec v tabeli deklariran kot lastnost, zato je mogoče vrednost pridobiti posamično.