Forbered dig på at få adgang til SQL Server ved hjælp af Entity Framework Core (database-first)

Side opdateret :
Dato for oprettelse af side :

Driftsmiljø

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8
Enhed Framework Core
  • Enhedsramme Core 8.0
SQL Server
  • SQL Server 2022

* Ovenstående er et verifikationsmiljø, men det kan fungere med andre versioner.

Først

Entity Framework Core er et bibliotek med O/R-kortlægninger. Når du får adgang til databasen, kan du få adgang til databasens poster via modeller (klasser), der er defineret i kode, uden at bruge SQL-sætninger direkte. Dette giver følgende fordele:

  • Da SQL-sætninger ikke skrives direkte, reduceres sikkerhedsrisici som SQL-injektion.
  • Da SQL-sætninger er strenge, selvom du laver en fejl i syntaksen, kontrolleres den ikke for build-fejl, men da modellen er en programsyntaks, kan du tjekke for fejl på build-tidspunktet.

Entity Framework Core kan automatisk generere kode fra eksisterende databaser for at oprette forbindelse til disse modeller og databaser. Omvendt er der en måde at skrive koden manuelt og derefter automatisk generere databasen.

Førstnævnte kaldes "database-først" og sidstnævnte kaldes "kode-først". Der er også "model-first", som genererer kode og databaser fra tegninger som ER-diagrammer, men det er ikke meget brugt i Entity Framework Core.

I dette tilfælde vil vi bruge et "database-først"-mønster, der genererer kode ud fra den antagelse, at databasen allerede eksisterer.

Opsætning af SQL Server

For at få adgang til SQL Server-databasen i dette tip skal du konfigurere SQL Server på forhånd. Det kan sættes op på en pc i udviklingsmiljøet eller på en anden pc via netværket. Hvis du kan oprette forbindelse til SQL Server fra dit udviklingsmiljø, er du godt i gang. I dette tip er SQL Server installeret i et separat miljø.

Konfigurationstrinnene til SQL Server udelades, fordi de er overflødige. De følgende sider indeholder SQL Server-relaterede tip, så hvis du vil vide, hvordan du konfigurerer det, skal du se det.

Opret en tabel

Denne gang vil vi oprette følgende database og tabel som en Mr./Ms..

  • Databasenavn: TestDatabase
  • Tabelnavn: Bruger
  • Tabelkolonner: [ID], [Navn], [Adgangskode], [Alder], [E-mail], [Fødselsdag], [UpdateDateTime]

Du kan oprette det på enhver måde, men hvis du ikke vil gøre det, skal du køre følgende SQL mod SQL Server for at generere det.

Følgende er databaseoprettelse SQL, men da stien til databaseoprettelse ændres afhængigt af versionen osv., kan det være mere pålideligt at oprette den med GUI eller kommando i stedet for 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

Oprettelse af tabel 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

Optag Tilføj 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

Opsætning af Visual Studio

Vi antager, at du allerede har konfigureret dette også. Hvis du vil vide opsætningsproceduren osv., er den opsummeret på næste side.

Opret et projekt

Entity Framework Core er ikke afhængig af et bestemt udførelsesmiljø, så det kan bruges i mange projekter. I denne artikel bruger vi Entity Framework Core i et simpelt konsolprogrammiljø.

I det nye projekt skal du vælge Konsolapp.

Projektet er blevet oprettet. Det er ligegyldigt, hvad projektnavnet er.

Hent Entity Framework Core-pakken

Hent en pakke til brug af Entity Framework Core med NuGet.

Højreklik på afhængigheden, og vælg Administrer NuGet-pakker.

Med "Gennemse" valgt fra fanen, indtast i EntityFrameworkCore søgefeltet. Du bør derefter se de Entity Framework Core-relaterede pakker på listen.

Da vi vil bruge SQL Server denne gang, installerer vi følgende pakker.

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

Microsoft.EntityFrameworkCore I dette eksempel installerer vi . Installer også de to andre.

Vælg installationsmålet, og klik på knappen Installer. For versionen skal du vælge den seneste stabile version.

Dialogboksen er dybest set OK, og du kan klikke på OK.

Installer også de to andre.

Jeg synes, at pakken ser sådan ud:

Oprette en model (kode) ud fra en databasetabelstruktur

Hvis du vil have modellen og anden kode genereret automatisk, skal du først oprette projektet for at sikre, at der ikke er nogen fejl. Hvis der er en fejl, mislykkes modeloprettelsen. Hvis du allerede har bekræftet, at der ikke er nogen fejl, behøver du ikke at oprette den.

Åbn Pakkehåndteringskonsollen fra Visual Studio. Hvis du ikke har en, kan du åbne den fra menuen "Værktøjer", "NuGet Package Manager", "Package Manager Console".

Følgende vindue vises, så sørg for, at "Standardprojekt" i øverste højre hjørne er det projekt, som du vil oprette en model til. (Du skal være forsigtig, hvis du har flere projekter)

Indtast følgende tekst i indtastningsfeltet: Parametrene ændres afhængigt af miljøet, så skift dem i henhold til følgende forklaringer rettidigt.

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

Eksempel på input

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
Eksempel på parameter descriptionParameter
Udbyder For SQL Server er det Microsoft.EntityFrameworkCore.SqlServer rettet. Microsoft.EntityFrameworkCore.SqlServer
Forbindelse Forbindelsesstrengen for at oprette forbindelse til databasen. Forbindelsesstrenge kan bruges til fælles med andre apps, så følg venligst notationen af forbindelsesstrenge for det indhold, der skal angives. Du kan bruge enten Windows-godkendelse eller SQL Server-godkendelse. Forresten bruges den kun midlertidigt til at oprette en model, så der er ingen grund til at være opmærksom på sikkerhed efter udgivelse af applikationen til denne forbindelsesstreng. Hvis du har symboler i din adgangskode, skal du passe på med at flygte. "Datakilde=Servernavn\SQLEXPRESS; Database=TestDatabase; bruger-id=Brugernavn; adgangskode=**********"
f Selv hvis programmet allerede eksisterer, vil det blive tvangsoverskrevet. Ingen <>
OutputDir Mappestien, hvor du vil udskrive koden. Sti i forhold til projektmappen Modeller\Database
Sammenhæng Kontekstklassenavne ved brug af Entity Framework TestDatabaseDbContext
BrugDatabasenavne Hvis det er angivet, vil tabelnavnet på databasen være klassenavnet, som det er. Hvis det ikke er angivet, justeres størrelsen af enhedsklassenavnet i henhold til reglerne. Ingen <>
DataAnmærkninger Når det er angivet, føjer kolonnetypen automatisk attributten DataAnnotation til hver egenskab. Dette er lidt nyttigt, hvis du automatisk vil udføre inputkontrol i henhold til databasetypen. Ingen <>
Namespace Det navneområde, som den genererede objektklasse tilhører. Hvis det ikke er angivet, bestemmes navneområdet i henhold til mappen. TestNamespace
Kontekstnavnområde Det navneområde, som den genererede kontekst tilhører. Hvis det ikke er angivet, bestemmes navneområdet i henhold til mappen. TestNamespace
NoOnConfiguring Integrer ikke rå forbindelsesstrenge i din kode. Ingen <>
NejFlertal Sørg for, at egenskabsnavnene for hvert tabelnavn i konteksten ikke er flertalstal. Ingen <>

Når du trykker på Enter for at køre den, genereres koden automatisk: Hvis der opstår en fejl, vises årsagen, så svar venligst i henhold til fejlindholdet.

User Tabellens modelkode er som følger.

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

Advarslen vises i øvrigt, fordi forbindelsesstrengen skrives, som den er i koden for den genererede kontekstklasse. Hvis det er muligt, skal forbindelsesstrengen gemmes et separat sted og indstilles ved kørsel, men i dette tilfælde er det med det formål at kontrollere operationen, så jeg lader det være, som det er.

Prøv at hente og vise poster

Nu hvor vi har koden til at få adgang til posterne i databasen, lad os prøve at hente posterne og vise dem på konsollen.

Program.cs og ændre den som følger.

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

Generer den automatisk genererede DbContext klasse new i . Det er deklareret i, så databaseforbindelser automatisk kan using var ødelægges.

dbContext genererer egenskaber for at få adgang til hver model, så i dette tilfælde User kan du manipulere posterne i tabellen ved at User få adgang til egenskaberne. Den SQL, der udstedes, genereres automatisk internt og behøver ikke at blive bemærket.

ToList Her bruges en udvidelsesmetode til at User hente alle posterne i tabellen.

foreach Resten gøres ved hjælp af metoderne og JsonSerializer.Serialize til at User vise oplysningerne på konsollen. Som User nævnt ovenfor er hver kolonne i tabellen deklareret som en egenskab, så det er muligt at hente værdien individuelt.