Forbered dig på at få adgang til SQL Server ved hjælp af Entity Framework Core (database-first)
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.