Voorbereiden op toegang tot SQL Server met behulp van Entity Framework Core (eerst database)
Werkomgeving
- Visuele Studio
-
- Visuele Studio 2022
- .NET
-
- .NET 8
- Kern van het entiteitskader
-
- Entiteit Framework Kern 8.0
- SQL Server
-
- SQL Server 2022
* Het bovenstaande is een verificatieomgeving, maar het kan werken met andere versies.
Eerst
Entity Framework Core is een bibliotheek met O/R-mappers. Wanneer u toegang krijgt tot de database, kunt u toegang krijgen tot de records van de database via modellen (klassen) die in code zijn gedefinieerd, zonder rechtstreeks SQL-instructies te gebruiken. Dit levert de volgende voordelen op:
- Omdat SQL-statements niet direct worden geschreven, worden beveiligingsrisico's zoals SQL-injectie verminderd.
- Aangezien SQL-instructies tekenreeksen zijn, wordt deze niet gecontroleerd op buildfouten, maar aangezien het model een programmasyntaxis is, kunt u tijdens het bouwen controleren op fouten, zelfs als u een fout maakt in de syntaxis.
Entity Framework Core kan automatisch code genereren uit bestaande databases om verbinding te maken met deze modellen en databases. Omgekeerd is er een manier om de code handmatig te schrijven en vervolgens automatisch de database te genereren.
De eerste wordt "database-first" genoemd en de laatste wordt "code-first" genoemd. Er is ook 'model-first', dat code en databases genereert op basis van blauwdrukken zoals ER-diagrammen, maar het wordt niet veel gebruikt in Entity Framework Core.
In dit geval gebruiken we een "database-first"-patroon dat code genereert in de veronderstelling dat de database al bestaat.
SQL Server instellen
Om toegang te krijgen tot de SQL Server-database in deze tip, moet u SQL Server van tevoren instellen. Het kan worden ingesteld op een pc in de ontwikkelomgeving of op een andere pc via het netwerk. Als u vanuit uw ontwikkelomgeving verbinding kunt maken met SQL Server, bent u klaar om te gaan. In deze tip is SQL Server in een aparte omgeving geïnstalleerd.
De installatiestappen van SQL Server worden weggelaten omdat ze redundant zijn. De volgende pagina's bevatten SQL Server-gerelateerde tips, dus als u wilt weten hoe u dit moet instellen, raadpleeg deze dan alstublieft.
Een tabel maken
Deze keer zullen we de volgende database en tabel maken als een meneer/mevrouw.
- Naam van de database: TestDatabase
- Tabelnaam: Gebruiker
- Tabelkolommen: [ID], [Naam], [Wachtwoord], [Leeftijd], [E-mail], [Verjaardag], [UpdateDateTime]
U kunt het op elke manier maken, maar als u het niet wilt doen, voert u de volgende SQL uit tegen SQL Server om het te genereren.
Het volgende is SQL voor het maken van databases, maar aangezien het pad voor het maken van databases verandert afhankelijk van de versie, enz., kan het betrouwbaarder zijn om het te maken met GUI of opdracht in plaats van 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
SQL voor het maken van tafels.
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
Record toevoegen 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-installatie
We gaan ervan uit dat je dit ook al hebt ingesteld. Als u de installatieprocedure, enz. wilt weten, wordt dit op de volgende pagina samengevat.
Een project maken
Entity Framework Core is niet afhankelijk van een bepaalde uitvoeringsomgeving en kan dus in veel projecten worden gebruikt. In dit artikel gebruiken we Entity Framework Core in een eenvoudige console-applicatieomgeving.
Selecteer in het nieuwe project de optie Console-app.
Het project is in het leven geroepen. Het maakt niet uit wat de naam van het project is.
Het Entity Framework Core-pakket downloaden
Ontvang een pakket voor het gebruik van Entity Framework Core met NuGet.
Klik met de rechtermuisknop op de afhankelijkheid en selecteer NuGet-pakketten beheren.
Met "Bladeren" geselecteerd op het tabblad, voert u in het EntityFrameworkCore
zoekveld in. U zou dan de Entity Framework Core-gerelateerde pakketten in de lijst moeten zien.
Aangezien we deze keer SQL Server zullen gebruiken, zullen we de volgende pakketten installeren.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
In dit voorbeeld installeren we . Installeer ook de andere twee.
Selecteer het installatiedoel en klik op de knop Installeren. Selecteer voor de versie de nieuwste stable.
Het dialoogvenster is in principe OK en u kunt op OK klikken.
Installeer ook de andere twee.
Ik denk dat het pakket er als volgt uitziet:
Een model (code) maken op basis van de structuur van een databasetabel
Als u het model en andere code automatisch wilt laten genereren, moet u eerst het project bouwen om er zeker van te zijn dat er geen fouten zijn. Als er een fout optreedt, mislukt het maken van het model. Als u al hebt geverifieerd dat er geen fouten zijn, hoeft u het niet te bouwen.
Open vanuit Visual Studio de Package Manager-console. Als je er geen hebt, kun je deze openen via het menu "Extra", "NuGet Package Manager", "Package Manager Console".
Het volgende venster wordt weergegeven, dus zorg ervoor dat het "Standaardproject" in de rechterbovenhoek het project is waarvoor u een model wilt maken. (Je moet voorzichtig zijn als je meerdere projecten hebt)
Vul in het invoerveld de volgende tekst in: De parameters veranderen afhankelijk van de omgeving, dus verander ze tijdig volgens de volgende toelichtingen.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Voorbeeld invoer
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
ParameterbeschrijvingParametervoorbeeld | ||
---|---|---|
Aanbieder | Voor SQL Server is het Microsoft.EntityFrameworkCore.SqlServer opgelost. |
Microsoft.EntityFrameworkCore.SqlServer |
Verbinding | De verbindingsreeks om verbinding te maken met de database. Connection strings kunnen op dezelfde manier worden gebruikt als andere apps, dus volg de notatie van connection strings voor de inhoud die moet worden opgegeven. U kunt Windows-verificatie of SQL Server-verificatie gebruiken. Overigens wordt het alleen tijdelijk gebruikt om een model te maken, dus het is niet nodig om op de hoogte te zijn van de beveiliging na het publiceren van de applicatie voor deze verbindingsreeks. Als je symbolen in je wachtwoord hebt, pas dan op dat je niet ontsnapt. | "Gegevensbron=ServerName\SQLEXPRESS; Databank=TestDatabank; gebruikers-id = Gebruikersnaam; wachtwoord=**********" |
f | Zelfs als het programma al bestaat, wordt het met geweld overschreven. | Geen <> |
Uitgang Dir | Het mappad waar u de code wilt uitvoeren. Pad ten opzichte van de projectmap | Modellen\Database |
Context | Namen van contextklassen bij het gebruik van het entiteitsframework | TestDatabaseDbContext |
Gebruik DatabaseNamen | Als dit is opgegeven, is de tabelnaam van de database de klassenaam zoals deze is. Indien niet gespecificeerd, wordt het hoofdlettergebruik van de naam van de entiteitsklasse aangepast volgens de regels. | Geen <> |
DataAnnotaties | Wanneer dit is opgegeven, voegt het kolomtype automatisch het kenmerk DataAnnotation toe aan elke eigenschap. Dit is een beetje handig als u automatisch invoercontroles wilt uitvoeren op basis van het type database. | Geen <> |
Naamruimte | De naamruimte waartoe de gegenereerde entiteitsklasse behoort. Als dit niet is opgegeven, wordt de naamruimte bepaald op basis van de map. | TestNaamruimte |
ContextNamespace | De naamruimte waartoe de gegenereerde context behoort. Als dit niet is opgegeven, wordt de naamruimte bepaald op basis van de map. | TestNaamruimte |
NoOnConfiguring | Sluit geen onbewerkte verbindingsreeksen in uw code in. | Geen <> |
GeenMeervoud | Zorg ervoor dat de eigenschapsnamen voor elke tabelnaam in de context niet in het meervoud worden gebruikt. | Geen <> |
Wanneer u op Enter drukt om het uit te voeren, wordt de code automatisch gegenereerd: Als er een fout optreedt, wordt de reden weergegeven, dus reageer op basis van de inhoud van de fout.
User
De modelcode van de tabel is als volgt.
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; }
}
Trouwens, de waarschuwing wordt weergegeven omdat de connection string is geschreven zoals deze is in de code van de gegenereerde contextklasse. Indien mogelijk moet de verbindingsreeks op een aparte plaats worden opgeslagen en tijdens runtime worden ingesteld, maar in dit geval is het bedoeld om de werking te controleren, dus ik laat het zoals het is.
Probeer records op te halen en weer te geven
Nu we de code hebben om toegang te krijgen tot de records in de database, gaan we proberen de records op te halen en weer te geven op de console.
Program.cs
en wijzig het als volgt.
// 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));
}
Genereer de automatisch gegenereerde DbContext
klasse new
in . Het wordt aangegeven zodat databaseverbindingen automatisch kunnen using var
worden vernietigd.
dbContext
genereert eigenschappen om toegang te krijgen tot elk model, dus in dit geval User
kunt u de records in de tabel manipuleren door User
toegang te krijgen tot de eigenschappen.
De SQL die wordt uitgegeven, wordt intern automatisch gegenereerd en hoeft niet te worden opgemerkt.
ToList
Hier wordt een extensiemethode gebruikt om alle records in de tabel op te User
halen.
foreach
De rest wordt gedaan met behulp van de en JsonSerializer.Serialize
methoden om de informatie op de console weer te User
geven.
Zoals User
hierboven vermeld, wordt elke kolom in de tabel gedeclareerd als een eigenschap, zodat het mogelijk is om de waarde afzonderlijk op te halen.