Pasirengimas pasiekti SQL serverį naudojant objektų sistemos branduolį (pirmiausia duomenų bazė)

Puslapis atnaujintas :
Puslapio sukūrimo data :

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.