SQL Serverile juurdepääsu ettevalmistamine rakenduse Entity Framework Core abil (andmebaasi esimene)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Töökeskkond

Visuaalne stuudio
  • Visual Studio 2022
.NET
  • .NET 8
Olemi raamistiku tuum
  • Olemi raamistiku tuum 8.0
SQL Server
  • SQL Server 2022

* Ülaltoodud on kinnituskeskkond, kuid see võib töötada ka teiste versioonidega.

Alguses

Olemi raamistiku tuum on O/R-kaardistajate teek. Andmebaasile juurdepääsul pääsete andmebaasi kirjetele juurde koodis määratletud mudelite (klasside) kaudu, ilma SQL-lauseid otse kasutamata. See pakub järgmisi eeliseid:

  • Kuna SQL-lauseid ei kirjutata otse, vähendatakse turvariske, näiteks SQL-i süstimist.
  • Kuna SQL-laused on stringid, isegi kui teete süntaksis vea, ei kontrollita seda ehitusvigade suhtes, kuid kuna mudel on programmi süntaks, saate ehitamise ajal vigu kontrollida.

Olemi raamistiku tuum saab automaatselt genereerida koodi olemasolevatest andmebaasidest, et luua ühendus nende mudelite ja andmebaasidega. Vastupidi, on olemas võimalus koodi käsitsi kirjutada ja seejärel andmebaas automaatselt genereerida.

Esimest nimetatakse "database-first" ja viimast "code-first". Samuti on olemas "mudel kõigepealt", mis genereerib joonistest (nt ER-diagrammidest) koodi ja andmebaasid, kuid seda ei kasutata olemi raamistiku tuumas laialdaselt.

Sel juhul kasutame "database-first" mustrit, mis genereerib koodi eeldusel, et andmebaas on juba olemas.

SQL serveri häälestamine

Selles näpunäites toodud SQL Serveri andmebaasile juurdepääsemiseks seadistage eelnevalt SQL Server. Seda saab seadistada arvutis arenduskeskkonnas või mõnes muus arvutis võrgu kaudu. Kui saate oma arenduskeskkonnast SQL Serveriga ühenduse luua, on kõik korras. Selles nõuandes installitakse SQL Server eraldi keskkonda.

SQL Serveri häälestusetapid jäetakse välja, kuna need on üleliigsed. Järgmised lehed sisaldavad SQL Serveriga seotud näpunäiteid, nii et kui soovite teada, kuidas seda seadistada, vaadake seda.

Tabeli loomine

Seekord loome hr/pr.-na järgmise andmebaasi ja tabeli.

  • Andmebaasi nimi: TestDatabase
  • Tabeli nimi: kasutaja
  • Tabeli veerud: [ID], [Nimi], [Parool], [Vanus], [E-post], [Sünnipäev], [UpdateDateTime]

Saate seda luua mis tahes viisil, kuid kui te ei soovi seda teha, käivitage selle loomiseks SQL Serveri vastu järgmine SQL.

Järgnev on andmebaasi loomise SQL, kuid kuna andmebaasi loomise tee muutub sõltuvalt versioonist jne, võib olla usaldusväärsem luua see SQL-i asemel GUI või käsuga.

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

Tabeli loomine 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

Salvesta SQL-i lisamine.

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 seadistamine

Eeldame, et olete ka selle juba seadistanud. Kui soovite teada seadistusprotseduuri jne, on see kokku võetud järgmisel lehel.

Projekti loomine

Olemi raamistiku tuumik ei sõltu ühestki konkreetsest täitmiskeskkonnast, seega saab seda kasutada paljudes projektides. Selles artiklis kasutame Entity Framework Core'i lihtsas konsoolirakenduse keskkonnas.

Uues projektis valige Konsoolirakendus.

Projekt on loodud. Pole tähtis, mis on projekti nimi.

Hankige olemi raamistiku põhipakett

Hankige pakett Entity Framework Core'i kasutamiseks koos NuGetiga.

Paremklõpsake sõltuvust ja valige NuGeti pakettide haldamine.

Kui vahekaardilt on valitud "Sirvi", sisestage otsinguväljale EntityFrameworkCore . Seejärel peaksite loendis nägema olemi raamistiku tuumaga seotud pakette.

Kuna seekord kasutame SQL Serverit, installime järgmised paketid.

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

Microsoft.EntityFrameworkCore Selles näites installime . Paigaldage ka ülejäänud kaks.

Valige installi sihtmärk ja klõpsake nuppu Installi. Versiooni jaoks valige uusim stabiilne.

Dialoog on põhimõtteliselt OK ja võite klõpsata nuppu OK.

Paigaldage ka ülejäänud kaks.

Ma arvan, et pakett näeb välja selline:

Mudeli (koodi) loomine andmebaasi tabelistruktuurist

Mudeli ja muu koodi automaatseks genereerimiseks koostage kõigepealt projekt, et veenduda, et vigu pole. Vea korral mudeli loomine ebaõnnestub. Kui olete juba kontrollinud, et vigu pole, ei pea te seda looma.

Avage Visual Studios paketihalduri konsool. Kui teil seda pole, saate selle avada menüüst "Tööriistad", "NuGet Package Manager", "Package Manager Console".

Kuvatakse järgmine aken, seega veenduge, et paremas ülanurgas olev "Vaikeprojekt" on projekt, mille jaoks soovite mudeli luua. (Peate olema ettevaatlik, kui teil on mitu projekti)

Sisestage sisestusväljale järgmine tekst: Parameetrid muutuvad sõltuvalt keskkonnast, seega palun muutke neid õigeaegselt vastavalt järgmistele selgitustele.

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

Sisendi näide

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
Parameetri kirjeldusParameetri näide
Pakkuja SQL Serveri jaoks on see Microsoft.EntityFrameworkCore.SqlServer fikseeritud. Microsoft.EntityFrameworkCore.SqlServer
Ühendus Ühendusstring andmebaasiga ühenduse loomiseks. Ühendusstringe saab kasutada koos teiste rakendustega, seega järgige sisu täpsustamiseks ühendusstringide märget. Võite kasutada kas Windowsi autentimist või SQL Serveri autentimist. Muide, seda kasutatakse ainult ajutiselt mudeli loomiseks, seega ei ole vaja pärast selle ühendusstringi rakenduse avaldamist turvalisusest teadlik olla. Kui teie paroolis on sümboleid, olge põgenemisel ettevaatlik. "Andmeallikas=ServerName\SQLEXPRESS; Andmebaas=TestDatabase; kasutaja id=Kasutajanimi; parool=**********"
f Isegi kui programm on juba olemas, kirjutatakse see sunniviisiliselt üle. Ei mingit <>
OutputDir Kaustatee, kuhu soovite koodi väljastada. Tee projekti kausta suhtes Mudelid\andmebaas
Kontekst Kontekstiklassi nimed olemi raamistiku kasutamisel TestDatabaseDbContext
UseDatabaseNames Kui see on määratud, on andmebaasi tabeli nimi klassi nimi sellisena, nagu see on. Kui seda ei ole täpsustatud, korrigeeritakse üksuse klassi nime vastavalt reeglitele. Ei mingit <>
DataAnnotations Kui see on määratud, lisab veerutüüp igale atribuudile automaatselt atribuudi DataAnnotation. See on natuke kasulik, kui soovite automaatselt teostada sisendkontrolle vastavalt andmebaasi tüübile. Ei mingit <>
Namespace Nimeruum, kuhu loodud olemiklass kuulub. Kui seda pole määratud, määratakse nimeruum vastavalt kaustale. TestNamespace
ContextNamespace Nimeruum, kuhu loodud kontekst kuulub. Kui seda pole määratud, määratakse nimeruum vastavalt kaustale. TestNamespace
NoOnConfiguring Ärge manustage koodile töötlemata ühendusstringe. Ei mingit <>
NoPluralize Veenduge, et iga tabelinime atribuudinimed kontekstis poleks mitmuses. Ei mingit <>

Kui vajutate selle käivitamiseks sisestusklahvi, genereeritakse kood automaatselt: Vea ilmnemisel kuvatakse põhjus, nii et palun vastake vastavalt vea sisule.

User Tabeli mudelikood on järgmine.

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

Muide, hoiatus kuvatakse, kuna ühendusstring on kirjutatud nii, nagu see on loodud kontekstiklassi koodis. Võimaluse korral tuleks ühendusstringi hoida eraldi kohas ja seada käitusajale, kuid sel juhul on see operatsiooni kontrollimise eesmärgil, nii et jätan selle nii, nagu see on.

Proovige kirjeid alla laadida ja kuvada

Nüüd, kui meil on andmebaasis olevatele kirjetele juurdepääsemiseks kood, proovime kirjed alla laadida ja konsoolil kuvada.

Program.cs ja muutke seda järgmiselt.

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

Looge automaatselt loodud DbContext klass new rakenduses . See deklareeritakse nii, et andmebaasi ühendusi saab using var automaatselt hävitada.

dbContext Genereerib atribuute igale mudelile juurdepääsuks, nii et sel juhul User saate atribuutidele juurdepääsedes User tabelis olevaid kirjeid manipuleerida. Väljastatud SQL genereeritakse automaatselt sisemiselt ja seda ei ole vaja märgata.

ToList Siin kasutatakse kõigi tabelis olevate kirjete toomiseks User laiendimeetodit.

foreach Ülejäänud tehakse konsoolil teabe kuvamiseks User meetodite JsonSerializer.Serialize abil. Nagu User eespool mainitud, deklareeritakse tabeli iga veerg atribuudina, seega on võimalik väärtus eraldi alla laadida.