Sagatavošanās piekļuvei SQL Server, izmantojot Entity Framework Core (vispirms datu bāze)
Darbības vide
- Visual Studio
-
- Visual Studio 2022
- .NETO
-
- .NET 8
- Entītiju struktūras kodols
-
- Entītijas struktūras kodols 8.0
- SQL serveris
-
- SQL Server 2022
* Iepriekš minētais ir verifikācijas vide, taču tas var darboties ar citām versijām.
Sākumā
Entity Framework Core ir O/R kartētāju bibliotēka. Piekļūstot datu bāzei, varat piekļūt datu bāzes ierakstiem, izmantojot kodā definētos modeļus (klases), tieši neizmantojot SQL priekšrakstus. Tas nodrošina šādas priekšrocības:
- Tā kā SQL priekšraksti netiek rakstīti tieši, drošības riski, piemēram, SQL injekcija, tiek samazināti.
- Tā kā SQL priekšraksti ir virknes, pat ja jūs kļūdāties sintaksē, tas netiek pārbaudīts, vai nav būvēšanas kļūdu, bet, tā kā modelis ir programmas sintakse, veidošanas laikā varat pārbaudīt, vai nav kļūdu.
Entity Framework Core var automātiski ģenerēt kodu no esošajām datu bāzēm, lai izveidotu savienojumu ar šiem modeļiem un datu bāzēm. Un otrādi, ir veids, kā rakstīt kodu manuāli un pēc tam automātiski ģenerēt datu bāzi.
Pirmo sauc par "database-first", bet otro - par "code-first". Ir arī "modelis vispirms", kas ģenerē kodu un datu bāzes no rasējumiem, piemēram, ER diagrammām, taču tas netiek plaši izmantots entītiju struktūras kodolā.
Šajā gadījumā mēs izmantosim modeli "datu bāze vispirms", kas ģenerē kodu, pieņemot, ka datu bāze jau pastāv.
SQL Server iestatīšana
Lai piekļūtu SQL Server datu bāzei šajā padomā, lūdzu, iepriekš iestatiet SQL Server. To var iestatīt datorā izstrādes vidē vai citā datorā, izmantojot tīklu. Ja varat izveidot savienojumu ar SQL Server no savas izstrādes vides, viss ir kārtībā. Šajā padomā SQL Server ir instalēts atsevišķā vidē.
SQL Server iestatīšanas darbības tiek izlaistas, jo tās ir liekas. Nākamajās lapās ir sniegti ar SQL Server saistīti padomi, tādēļ, ja vēlaties uzzināt, kā to iestatīt, lūdzu, skatiet to.
Tabulas izveide
Šoreiz mēs izveidosim šādu datu bāzi un tabulu kā Mr./Ms..
- Datu bāzes nosaukums: TestDatabase
- Tabulas nosaukums: Lietotājs
- Tabulas kolonnas: [ID], [Vārds], [Parole], [Vecums], [E-pasts], [Dzimšanas diena], [UpdateDateTime]
To var izveidot jebkādā veidā, bet, ja nevēlaties to darīt, palaidiet tālāk norādīto SQL pret SQL Server, lai to ģenerētu.
Tālāk ir datu bāzes izveides SQL, bet, tā kā datu bāzes izveides ceļš mainās atkarībā no versijas utt., Var būt ticamāk to izveidot ar GUI vai komandu, nevis 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
Tabulas izveide 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
Ieraksts Pievienot 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 iestatīšana
Mēs pieņemam, ka arī jūs to jau esat izveidojis. Ja vēlaties uzzināt iestatīšanas procedūru utt., Tas ir apkopots nākamajā lapā.
Izveidojiet projektu
Entity Framework Core nav atkarīgs no kādas konkrētas izpildes vides, tāpēc to var izmantot daudzos projektos. Šajā rakstā mēs izmantosim Entity Framework Core vienkāršā konsoles lietojumprogrammu vidē.
Jaunajā projektā atlasiet Konsoles lietotne.
Projekts ir izveidots. Nav svarīgi, kāds ir projekta nosaukums.
Iegūstiet Entity Framework pamata pakotni
Iegūstiet pakotni Entity Framework Core izmantošanai ar NuGet.
Ar peles labo pogu noklikšķiniet uz atkarības un atlasiet Pārvaldīt NuGet pakotnes.
Kad cilnē ir atlasīts "Pārlūkot", ievadiet EntityFrameworkCore
meklēšanas laukā. Pēc tam sarakstā vajadzētu redzēt ar Entity Framework Core saistītās pakotnes.
Tā kā šoreiz mēs izmantosim SQL Server, mēs instalēsim šādas pakotnes.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
Šajā piemērā mēs instalējam . Instalējiet arī pārējos divus.
Atlasiet instalācijas mērķi un noklikšķiniet uz pogas Instalēt. Versijai atlasiet jaunāko stabilo.
Dialoglodziņš būtībā ir OK, un jūs varat noklikšķināt uz Labi.
Instalējiet arī pārējos divus.
Es domāju, ka pakete izskatās šādi:
Modeļa (koda) izveide no datu bāzes tabulas struktūras
Lai automātiski ģenerētu modeli un citu kodu, vispirms izveidojiet projektu, lai pārliecinātos, ka nav kļūdu. Ja rodas kļūda, modeļa izveide neizdodas. Ja jau esat pārliecinājies, ka kļūdu nav, tas nav jāveido.
Programmā Visual Studio atveriet pakotņu pārvaldnieka konsoli. Ja jums tāda nav, varat to atvērt no izvēlnes "Rīki", "NuGet Package Manager", "Package Manager Console".
Tiks parādīts šāds logs, tāpēc pārliecinieties, vai "Noklusējuma projekts" augšējā labajā stūrī ir projekts, kuram vēlaties izveidot modeli. (Jums jābūt uzmanīgiem, ja jums ir vairāki projekti)
Ievades laukā ievadiet šādu tekstu: Parametri mainās atkarībā no vides, tāpēc, lūdzu, savlaicīgi mainiet tos saskaņā ar šādiem paskaidrojumiem.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Ievades piemērs
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
Parametra | aprakstsParametra | piemērs |
---|---|---|
Sniedzējs | SQL Server gadījumā tas Microsoft.EntityFrameworkCore.SqlServer ir fiksēts. |
Microsoft.EntityFrameworkCore.SqlServer |
Sakars | Savienojuma virkne, lai izveidotu savienojumu ar datu bāzi. Savienojuma virknes var izmantot kopīgi ar citām lietotnēm, tāpēc, lai norādītu saturu, lūdzu, ievērojiet savienojuma virkņu apzīmējumu. Varat izmantot Windows autentifikāciju vai SQL Server autentifikāciju. Starp citu, tas tiek izmantots tikai īslaicīgi, lai izveidotu modeli, tāpēc pēc šīs savienojuma virknes lietojumprogrammas publicēšanas nav jāapzinās drošība. Ja jūsu parolē ir simboli, uzmanieties, lai izbēgtu. | "Datu avots=Servera_nosaukums\SQLEXPRESS; Datu bāze=TestDatabase; lietotāja id=Lietotājvārds; parole=**********" |
f | Pat ja programma jau pastāv, tā tiks piespiedu kārtā pārrakstīta. | Nav <> |
OutputDir | Mapes ceļš, kurā vēlaties izvadīt kodu. Ceļš attiecībā pret projekta mapi | Modeļi\Datu bāze |
Kontekstā | Konteksta klašu nosaukumi, izmantojot entītiju struktūru | TestDatabaseDbContext |
UseDatabaseNames | Ja norādīts, datu bāzes tabulas nosaukums būs klases nosaukums, kāds tas ir. Ja tas nav norādīts, vienības klases nosaukuma gadījums tiek koriģēts atbilstoši kārtulām. | Nav <> |
DataAnnotations | Ja norādīts, kolonnas tips katram rekvizītam automātiski pievieno atribūtu DataAnnotation. Tas ir nedaudz noderīgi, ja vēlaties automātiski veikt ievades pārbaudes atbilstoši datu bāzes tipam. | Nav <> |
Nosaukumvieta | Nosaukumvieta, kurai pieder ģenerētā entītijas klase. Ja tas nav norādīts, nosaukumvieta tiek noteikta atbilstoši mapei. | TestNamespace |
ContextNamespace | Nosaukumvieta, kurai pieder ģenerētais konteksts. Ja tas nav norādīts, nosaukumvieta tiek noteikta atbilstoši mapei. | TestNamespace |
NoOnConfiguring | Neieguliet kodā neapstrādātas savienojuma virknes. | Nav <> |
NoPluralize | Pārliecinieties, vai katras tabulas nosaukuma rekvizītu nosaukumi kontekstā nav daudzskaitlī. | Nav <> |
Nospiežot taustiņu Enter, lai to palaistu, kods tiek ģenerēts automātiski: Ja rodas kļūda, tiks parādīts iemesls, tāpēc, lūdzu, atbildiet atbilstoši kļūdas saturam.
User
Tabulas modeļa kods ir šāds.
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; }
}
Starp citu, brīdinājums tiek parādīts, jo savienojuma virkne ir rakstīta tā, kā tas ir ģenerētās konteksta klases kodā. Ja iespējams, savienojuma virkne jāglabā atsevišķā vietā un jāiestata izpildlaikā, bet šajā gadījumā tas ir paredzēts, lai pārbaudītu darbību, tāpēc es to atstāšu tādu, kāds tas ir.
Mēģiniet izgūt un parādīt ierakstus
Tagad, kad mums ir kods, lai piekļūtu ierakstiem datu bāzē, mēģināsim izgūt ierakstus un parādīt tos konsolē.
Program.cs
un modificējiet to šādi.
// 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));
}
Ģenerējiet automātiski ģenerēto DbContext
klasi new
pakalpojumā . Tas tiek deklarēts, lai datu bāzes savienojumus varētu using var
automātiski iznīcināt.
dbContext
ģenerē rekvizītus, lai piekļūtu katram modelim, tāpēc šajā gadījumā User
varat manipulēt ar tabulā User
esošajiem ierakstiem, piekļūstot rekvizītiem.
Izdotais SQL tiek automātiski ģenerēts iekšēji, un tas nav jāpamana.
ToList
Šeit tiek izmantota paplašināšanas metode, lai User
izgūtu visus tabulas ierakstus.
foreach
Pārējais tiek darīts, izmantojot un JsonSerializer.Serialize
metodes, lai User
parādītu informāciju konsolē.
Kā User
minēts iepriekš, katra tabulas kolonna ir deklarēta kā īpašums, tāpēc vērtību ir iespējams izgūt atsevišķi.