SQL Serverile juurdepääsu ettevalmistamine rakenduse Entity Framework Core abil (andmebaasi esimene)
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.