Pasirengimas pasiekti SQL serverį naudojant objektų sistemos branduolį (pirmiausia duomenų bazė)
Darbo aplinka
- Vizualinė studija
-
- "Visual Studio 2022"
- .GRYNOJI
-
- .NET 8
- Subjekto pagrindų branduolys
-
- Subjektų sistemos branduolys 8.0
- SQL serveris
-
- "SQL Server 2022"
* Tai, kas išdėstyta pirmiau, yra patvirtinimo aplinka, tačiau ji gali veikti su kitomis versijomis.
Iš pradžių
"Entity Framework Core" yra O / R žemėlapių sudarytojų biblioteka. Prisijungdami prie duomenų bazės, galite pasiekti duomenų bazės įrašus per kodu apibrėžtus modelius (klases), tiesiogiai nenaudodami SQL sakinių. Tai suteikia šiuos privalumus:
- Kadangi SQL teiginiai nėra rašomi tiesiogiai, saugumo rizika, pvz., SQL injekcija, sumažėja.
- Kadangi SQL teiginiai yra eilutės, net jei sintaksėje darote klaidą, ji nėra tikrinama, ar nėra kūrimo klaidų, tačiau kadangi modelis yra programos sintaksė, kūrimo metu galite patikrinti, ar nėra klaidų.
"Entity Framework Core" gali automatiškai generuoti kodą iš esamų duomenų bazių, kad prisijungtų prie šių modelių ir duomenų bazių. Ir atvirkščiai, yra būdas parašyti kodą rankiniu būdu ir tada automatiškai sugeneruoti duomenų bazę.
Pirmasis vadinamas "pirmiausia duomenų baze", o antrasis - "pirmiausia kodu". Taip pat yra "pirmiausia modelis", kuris generuoja kodą ir duomenų bazes iš brėžinių, pvz., ER diagramų, tačiau jis nėra plačiai naudojamas "Entity Framework Core".
Tokiu atveju naudosime modelį "pirmiausia duomenų bazė", kuris generuoja kodą darant prielaidą, kad duomenų bazė jau egzistuoja.
SQL serverio sąranka
Norėdami pasiekti šiame patarime pateiktą SQL serverio duomenų bazę, iš anksto nustatykite SQL serverį. Jį galima nustatyti kompiuteryje kūrimo aplinkoje arba kitame kompiuteryje per tinklą. Jei galite prisijungti prie SQL serverio iš savo kūrimo aplinkos, galite pradėti. Šiame patarime SQL serveris įdiegiamas atskiroje aplinkoje.
SQL serverio sąrankos veiksmai praleidžiami, nes jie yra nereikalingi. Tolesniuose puslapiuose yra su SQL serveriu susijusių patarimų, todėl, jei norite sužinoti, kaip jį nustatyti, skaitykite jį.
Lentelės kūrimas
Šį kartą mes sukursime šią duomenų bazę ir lentelę kaip ponas / ponia.
- Duomenų bazės pavadinimas: TestDatabase
- Lentelės pavadinimas: Vartotojas
- Lentelės stulpeliai: [ID], [Vardas], [Slaptažodis], [Amžius], [El. paštas], [Gimtadienis], [UpdateDateTime]
Galite jį sukurti bet kokiu būdu, bet jei nenorite to daryti, paleiskite šį SQL prieš SQL serverį, kad jį sugeneruotumėte.
Toliau pateikiamas duomenų bazės kūrimo SQL, tačiau kadangi duomenų bazės kūrimo kelias keičiasi priklausomai nuo versijos ir pan., Gali būti patikimiau ją sukurti naudojant GUI arba komandą, o ne 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
Lentelės kūrimas 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
Įrašo papildymas 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
"Visual Studio" sąranka
Manome, kad jūs taip pat jau nustatėte tai. Jei norite sužinoti sąrankos procedūrą ir pan., ji apibendrinta kitame puslapyje.
Projekto kūrimas
"Entity Framework Core" nepriklauso nuo jokios konkrečios vykdymo aplinkos, todėl jį galima naudoti daugelyje projektų. Šiame straipsnyje "Entity Framework Core" naudosime paprastoje konsolės programų aplinkoje.
Naujame projekte pasirinkite Konsolės programa.
Projektas buvo sukurtas. Nesvarbu, koks yra projekto pavadinimas.
Gaukite pagrindinių subjektų pagrindų dokumentų rinkinį
Gaukite paketą, skirtą naudoti "Entity Framework Core" su "NuGet".
Dešiniuoju pelės mygtuku spustelėkite priklausomybę ir pasirinkite Tvarkyti "NuGet" paketus.
Skirtuke pasirinkę "Naršyti", įveskite EntityFrameworkCore
paieškos laukelį. Tada sąraše turėtumėte pamatyti su "Entity Framework Core" susijusius paketus.
Kadangi šį kartą naudosime SQL serverį, įdiegsime šiuos paketus.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
Šiame pavyzdyje diegiame . Įdiekite ir kitus du.
Pasirinkite diegimo tikslą ir spustelėkite mygtuką Įdiegti. Versijai pasirinkite naujausią stabilų.
Dialogo langas iš esmės yra gerai ir galite spustelėti Gerai.
Įdiekite ir kitus du.
Manau, kad paketas atrodo taip:
Modelio (kodo) kūrimas iš duomenų bazės lentelės struktūros
Norėdami, kad modelis ir kitas kodas būtų sugeneruoti automatiškai, pirmiausia sukurkite projektą, kad įsitikintumėte, jog nėra klaidų. Jei įvyksta klaida, modelio sukurti nepavyksta. Jei jau įsitikinote, kad nėra klaidų, jums nereikia jo kurti.
"Visual Studio" atidarykite paketų tvarkyklės konsolę. Jei jo neturite, galite jį atidaryti meniu "Įrankiai", "NuGet Package Manager", "Package Manager Console".
Bus rodomas šis langas, todėl įsitikinkite, kad viršutiniame dešiniajame kampe esantis "Numatytasis projektas" yra projektas, kuriam norite sukurti modelį. (Turite būti atsargūs, jei turite kelis projektus)
Įvesties lauke įveskite šį tekstą: Parametrai keičiasi priklausomai nuo aplinkos, todėl prašome juos laiku pakeisti pagal šiuos paaiškinimus.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Įvesties pavyzdys
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
Parametro | aprašymasParametro | pavyzdys |
---|---|---|
Teikėjas | SQL serveriui jis Microsoft.EntityFrameworkCore.SqlServer yra fiksuotas. |
Microsoft.EntityFrameworkCore.SqlServer |
Ryšys | Jungimosi eilutė, skirta prisijungti prie duomenų bazės. Ryšio eilutės gali būti naudojamos kartu su kitomis programomis, todėl vadovaukitės ryšio eilučių žymėjimu, kad turinys būtų nurodytas. Galite naudoti "Windows" autentifikavimą arba SQL serverio autentifikavimą. Beje, jis naudojamas tik laikinai modeliui sukurti, todėl paskelbus šios jungimosi eilutės programą nereikia žinoti apie saugumą. Jei slaptažodyje yra simbolių, būkite atsargūs pabėgdami. | "Duomenų šaltinis=ServerName\SQLEXPRESS; Duomenų bazė=TestDatabase; vartotojo id=UserName; slaptažodis=**********" |
f | Net jei programa jau egzistuoja, ji bus priverstinai perrašyta. | Nėra <> |
OutputDir | Aplanko kelias, kuriame norite išvesti kodą. Kelias, susijęs su projekto aplanku | Modeliai\Duomenų bazė |
Kontekste | Konteksto klasių pavadinimai naudojant objekto sistemą | TestDatabaseDbKontekstas |
UseDatabaseNames | Jei nurodyta, duomenų bazės lentelės pavadinimas bus klasės pavadinimas, koks jis yra. Jei nenurodyta, objekto klasės pavadinimo atvejis koreguojamas pagal taisykles. | Nėra <> |
DuomenysAnnotacijos | Kai nurodyta, stulpelio tipas automatiškai prideda atributą DataAnnotation prie kiekvienos ypatybės. Tai šiek tiek naudinga, jei norite automatiškai atlikti įvesties patikrinimus pagal duomenų bazės tipą. | Nėra <> |
Vardų sritis | Vardų sritis, kuriai priklauso sugeneruota objektų klasė. Jei nenurodyta, vardų sritis nustatoma pagal aplanką. | TestNamespace |
KontekstasVardų sritis | Vardų sritis, kuriai priklauso sugeneruotas kontekstas. Jei nenurodyta, vardų sritis nustatoma pagal aplanką. | TestNamespace |
NoOnConfiguring | Neįdėkite neapdorotų ryšio eilučių į savo kodą. | Nėra <> |
NoPluralize | Įsitikinkite, kad kiekvienos lentelės pavadinimo ypatybių pavadinimai kontekste nėra daugiskaitiniai. | Nėra <> |
Kai paspausite Enter, kad jį paleistumėte, kodas automatiškai sugeneruojamas: Jei įvyksta klaida, bus rodoma priežastis, todėl atsakykite pagal klaidos turinį.
User
Lentelės modelio kodas yra toks.
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; }
}
Beje, įspėjimas rodomas, nes ryšio eilutė parašyta taip, kaip ji yra sugeneruotos konteksto klasės kode. Jei įmanoma, ryšio eilutė turėtų būti saugoma atskiroje vietoje ir nustatyta vykdymo metu, tačiau šiuo atveju ji skirta operacijai patikrinti, todėl paliksiu ją tokią, kokia yra.
Pabandykite nuskaityti ir rodyti įrašus
Dabar, kai turime kodą, leidžiantį pasiekti įrašus duomenų bazėje, pabandykime gauti įrašus ir rodyti juos konsolėje.
Program.cs
ir pakeisti jį taip.
// 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));
}
Generuokite automatiškai sugeneruotą DbContext
klasę new
. Jis deklaruojamas taip, kad duomenų bazės ryšius būtų galima using var
automatiškai sunaikinti.
dbContext
generuoja ypatybes, kad būtų galima pasiekti kiekvieną modelį, todėl šiuo atveju User
, galite manipuliuoti lentelės įrašais pasiekdami User
ypatybes.
Išduotas SQL automatiškai generuojamas viduje ir jo nereikia pastebėti.
ToList
Čia visiems lentelės įrašams gauti naudojamas User
plėtinio metodas.
foreach
Likusi dalis atliekama naudojant ir JsonSerializer.Serialize
metodus, kad User
informacija būtų rodoma konsolėje.
Kaip User
minėta pirmiau, kiekvienas lentelės stulpelis deklaruojamas kaip nuosavybė, todėl vertę galima gauti atskirai.