Vorbereiten des Zugriffs auf SQL Server mit Entity Framework Core (Datenbank zuerst)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

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.