Vorbereiten des Zugriffs auf SQL Server mit Entity Framework Core (Datenbank zuerst)
Betriebsumgebung
- Visuelles Studio
-
- Visual Studio 2022
- .NETTO
-
- .NET 8
- Entity Framework-Kern
-
- Entity Framework Core 8.0
- SQL Server
-
- SQL Server 2022
* Bei der obigen Version handelt es sich um eine Verifizierungsumgebung, die jedoch möglicherweise mit anderen Versionen funktioniert.
Zuerst
Entity Framework Core ist eine Bibliothek von O/R-Mappern. Beim Zugriff auf die Datenbank können Sie über Modelle (Klassen), die im Code definiert sind, auf die Datensätze der Datenbank zugreifen, ohne SQL-Anweisungen direkt zu verwenden. Dies bietet folgende Vorteile:
- Da SQL-Anweisungen nicht direkt geschrieben werden, werden Sicherheitsrisiken, wie z. B. SQL-Injection, reduziert.
- Da es sich bei SQL-Anweisungen um Zeichenfolgen handelt, wird auch bei einem Fehler in der Syntax nicht nach Buildfehlern gesucht, aber da es sich bei dem Modell um eine Programmsyntax handelt, können Sie zur Buildzeit nach Fehlern suchen.
Entity Framework Core kann automatisch Code aus vorhandenen Datenbanken generieren, um eine Verbindung mit diesen Modellen und Datenbanken herzustellen. Umgekehrt gibt es eine Möglichkeit, den Code manuell zu schreiben und dann die Datenbank automatisch zu generieren.
Ersteres wird als "Database-First" und Letzteres als "Code-First" bezeichnet. Es gibt auch "Model-First", das Code und Datenbanken aus Blaupausen wie ER-Diagrammen generiert, aber es wird in Entity Framework Core nicht häufig verwendet.
In diesem Fall verwenden wir ein "Database-First"-Muster, das Code unter der Annahme generiert, dass die Datenbank bereits vorhanden ist.
SQL Server-Einrichtung
Um auf die SQL Server Datenbank in diesem Tipp zugreifen zu können, richten Sie bitte vorab den SQL Server ein. Es kann auf einem PC in der Entwicklungsumgebung oder auf einem anderen PC über das Netzwerk eingerichtet werden. Wenn Sie von Ihrer Entwicklungsumgebung aus eine Verbindung mit SQL Server herstellen können, können Sie loslegen. In diesem Tipp wird SQL Server in einer separaten Umgebung installiert.
Die SQL Server-Setupschritte werden weggelassen, da sie redundant sind. Auf den folgenden Seiten finden Sie Tipps zu SQL Server. Wenn Sie also wissen möchten, wie Sie es einrichten, lesen Sie es bitte.
Erstellen einer Tabelle
Dieses Mal erstellen wir die folgende Datenbank und Tabelle als Herr/Frau.
- Name der Datenbank: TestDatabase
- Name der Tabelle: Benutzer
- Tabellenspalten: [ID], [Name], [Passwort], [Alter], [E-Mail], [Geburtstag], [UpdateDateTime]
Sie können es auf beliebige Weise erstellen, aber wenn Sie es nicht tun möchten, führen Sie das folgende SQL für SQL Server aus, um es zu generieren.
Im Folgenden handelt es sich um SQL-Datenbankerstellung, aber da sich der Pfad der Datenbankerstellung je nach Version usw. ändert, kann es zuverlässiger sein, ihn mit der GUI oder dem Befehl anstelle von SQL zu erstellen.
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-Tabellenerstellung.
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 Append 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-Einrichtung
Wir gehen davon aus, dass Sie dies ebenfalls bereits eingerichtet haben. Wenn Sie wissen möchten, wie die Einrichtung usw. vorgeht, finden Sie diese auf der folgenden Seite zusammengefasst.
Erstellen eines Projekts
Entity Framework Core ist nicht von einer bestimmten Ausführungsumgebung abhängig und kann daher in vielen Projekten verwendet werden. In diesem Artikel verwenden wir Entity Framework Core in einer einfachen Konsolenanwendungsumgebung.
Wählen Sie im neuen Projekt Konsolen-App aus.
Das Projekt wurde erstellt. Es spielt keine Rolle, wie der Projektname lautet.
Abrufen des Entity Framework Core-Pakets
Rufen Sie ein Paket für die Verwendung von Entity Framework Core mit NuGet ab.
Klicken Sie mit der rechten Maustaste auf die Abhängigkeit, und wählen Sie NuGet-Pakete verwalten aus.
Wenn Sie auf der Registerkarte "Durchsuchen" ausgewählt haben, geben Sie in das EntityFrameworkCore
Suchfeld ein. In der Liste sollten dann die Entity Framework Core-bezogenen Pakete angezeigt werden.
Da wir dieses Mal SQL Server verwenden werden, werden wir die folgenden Pakete installieren.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
In diesem Beispiel installieren wir . Installieren Sie auch die anderen beiden.
Wählen Sie das Installationsziel aus und klicken Sie auf die Schaltfläche Installieren. Wählen Sie als Version die neueste stabile Version aus.
Der Dialog ist grundsätzlich in Ordnung und Sie können auf OK klicken.
Installieren Sie auch die anderen beiden.
Ich denke, das Paket sieht so aus:
Erstellen eines Modells (Code) aus einer Datenbanktabellenstruktur
Damit das Modell und anderer Code automatisch generiert werden, erstellen Sie zuerst das Projekt, um sicherzustellen, dass keine Fehler vorhanden sind. Wenn ein Fehler auftritt, schlägt die Modellerstellung fehl. Wenn Sie bereits überprüft haben, dass keine Fehler vorhanden sind, müssen Sie es nicht erstellen.
Öffnen Sie in Visual Studio die Paket-Manager-Konsole. Wenn Sie keines haben, können Sie es über das Menü "Extras", "NuGet-Paket-Manager", "Paket-Manager-Konsole" öffnen.
Das folgende Fenster wird angezeigt, stellen Sie also sicher, dass das "Standardprojekt" in der oberen rechten Ecke das Projekt ist, für das Sie ein Modell erstellen möchten. (Sie müssen vorsichtig sein, wenn Sie mehrere Projekte haben)
Geben Sie folgenden Text in das Eingabefeld ein: Die Parameter ändern sich je nach Umgebung, daher ändern Sie sie bitte rechtzeitig gemäß den folgenden Erklärungen.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Beispiel-Eingabe
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
ParameterbeschreibungBeispiel für einen Parameter | ||
---|---|---|
Anbieter | Für SQL Server ist es Microsoft.EntityFrameworkCore.SqlServer behoben. |
Microsoft.EntityFrameworkCore.SqlServer |
Verbindung | Die Verbindungszeichenfolge, um eine Verbindung mit der Datenbank herzustellen. Verbindungszeichenfolgen können gemeinsam mit anderen Apps verwendet werden, daher folgen Sie bitte der Schreibweise von Verbindungszeichenfolgen für die anzugebenden Inhalte. Sie können entweder die Windows-Authentifizierung oder die SQL Server-Authentifizierung verwenden. Es wird übrigens nur temporär verwendet, um ein Modell zu erstellen, so dass es nicht notwendig ist, nach der Veröffentlichung der Anwendung für diese Verbindungszeichenfolge auf die Sicherheit zu achten. Wenn Sie Symbole in Ihrem Passwort haben, achten Sie darauf, dass Sie nicht entkommen. | "Datenquelle=Servername\SQLEXPRESS; Datenbank=TestDatenbank; Benutzer-ID = Benutzername; password=**********" |
f | Auch wenn das Programm bereits existiert, wird es zwangsweise überschrieben. | Keine <> |
AusgabeVerzeichnis | Der Ordnerpfad, in dem Sie den Code ausgeben möchten. Pfad relativ zum Projektordner | Modelle\Datenbank |
Zusammenhang | Namen von Kontextklassen bei Verwendung von Entity Framework | TestDatabaseDbContext |
UseDatabaseNames (Datenbanknamen) | Wenn angegeben, ist der Tabellenname der Datenbank der Klassenname, wie er ist. Wenn nicht angegeben, wird die Groß-/Kleinschreibung des Namens der Entitätsklasse gemäß den Regeln angepasst. | Keine <> |
DataAnnotations | Wenn angegeben, fügt der Spaltentyp automatisch das DataAnnotation-Attribut an jede Eigenschaft an. Dies ist ein wenig nützlich, wenn Sie automatisch Eingabeprüfungen je nach Datenbanktyp durchführen möchten. | Keine <> |
Namespace | Der Namespace, zu dem die generierte Entitätsklasse gehört. Wenn nicht angegeben, wird der Namespace entsprechend dem Ordner bestimmt. | TestNamespace |
Kontext-Namensraum | Der Namespace, zu dem der generierte Context gehört. Wenn nicht angegeben, wird der Namespace entsprechend dem Ordner bestimmt. | TestNamespace |
NoOnKonfigurieren | Betten Sie keine unformatierten Verbindungszeichenfolgen in Ihren Code ein. | Keine <> |
NoPluralize | Stellen Sie sicher, dass die Eigenschaftsnamen für die einzelnen Tabellennamen im Kontext nicht im Plural stehen. | Keine <> |
Wenn Sie die Eingabetaste drücken, um ihn auszuführen, wird der Code automatisch generiert: Tritt ein Fehler auf, wird der Grund angezeigt, reagieren Sie also bitte entsprechend des Fehlerinhalts.
User
Der Modellcode der Tabelle lautet wie folgt.
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; }
}
Die Warnung wird übrigens angezeigt, weil der Verbindungsstring so geschrieben wird, wie er im Code der generierten Kontextklasse steht. Wenn möglich, sollte die Verbindungszeichenfolge an einem separaten Ort gespeichert und zur Laufzeit festgelegt werden, aber in diesem Fall dient sie dem Zweck, den Vorgang zu überprüfen, daher werde ich sie so lassen, wie sie ist.
Versuchen Sie, Datensätze abzurufen und anzuzeigen
Nachdem wir nun den Code für den Zugriff auf die Datensätze in der Datenbank haben, versuchen wir, die Datensätze abzurufen und in der Konsole anzuzeigen.
Program.cs
und ändern Sie sie wie folgt.
// 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));
}
Generieren Sie die automatisch generierte DbContext
Klasse new
in . Es ist in deklariert, damit Datenbankverbindungen automatisch zerstört werden können using var
.
dbContext
Generiert Eigenschaften für den Zugriff auf die einzelnen Modelle, sodass Sie in diesem Fall User
die Datensätze in der Tabelle bearbeiten können, indem User
Sie auf die Eigenschaften zugreifen.
Die ausgegebene SQL wird automatisch intern generiert und muss nicht bemerkt werden.
ToList
Hier wird eine Erweiterungsmethode verwendet, um alle Datensätze in der Tabelle abzurufenUser
.
foreach
Der Rest wird mit den Methoden und JsonSerializer.Serialize
erledigt, um die Informationen auf der Konsole anzuzeigenUser
.
Wie User
oben erwähnt, wird jede Spalte in der Tabelle als Eigenschaft deklariert, so dass es möglich ist, den Wert einzeln abzurufen.