Priprava na dostop do strežnika SQL Server s programom Entity Framework Core (najprej z bazo podatkov)
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.