Sagatavošanās piekļuvei SQL Server, izmantojot Entity Framework Core (vispirms datu bāze)

Lapa atjaunota :
Lapas izveides datums :

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.