Przygotowanie do uzyskiwania dostępu do programu SQL Server przy użyciu programu Entity Framework Core (najpierw baza danych)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko pracy

Visual Studio
  • informacji o wersji Visual Studio 2022
.SIEĆ
  • .NET 8
Entity Framework Core
  • Entity Framework Core 8.0
Serwer SQL
  • SQL Server 2022 r.

* Powyższe jest środowiskiem weryfikacyjnym, ale może działać z innymi wersjami.

Na początku

Entity Framework Core to biblioteka mapperów O/R. Uzyskując dostęp do bazy danych, można uzyskać dostęp do rekordów bazy danych za pośrednictwem modeli (klas) zdefiniowanych w kodzie, bez bezpośredniego używania instrukcji SQL. Zapewnia to następujące korzyści:

  • Ponieważ instrukcje SQL nie są zapisywane bezpośrednio, zagrożenia bezpieczeństwa, takie jak wstrzykiwanie kodu SQL, są zmniejszone.
  • Ponieważ instrukcje SQL są ciągami, nawet jeśli popełnisz błąd w składni, nie jest on sprawdzany pod kątem błędów kompilacji, ale ponieważ model jest składnią programu, możesz sprawdzić błędy w czasie kompilacji.

Program Entity Framework Core może automatycznie generować kod z istniejących baz danych w celu nawiązania połączenia z tymi modelami i bazami danych. I odwrotnie, istnieje sposób na ręczne napisanie kodu, a następnie automatyczne wygenerowanie bazy danych.

Pierwsza z nich nazywa się "najpierw baza danych", a druga "najpierw kod". Istnieje również funkcja "najpierw model", która generuje kod i bazy danych na podstawie strategii, takich jak diagramy ER, ale nie jest powszechnie używana w programie Entity Framework Core.

W tym przypadku użyjemy wzorca "database-first", który generuje kod przy założeniu, że baza danych już istnieje.

Konfiguracja programu SQL Server

Aby uzyskać dostęp do bazy danych SQL Server w tej wskazówce, skonfiguruj wcześniej SQL Server. Można go skonfigurować na komputerze PC w środowisku programistycznym lub na innym komputerze za pośrednictwem sieci. Jeśli możesz połączyć się z programem SQL Server ze środowiska programistycznego, możesz zacząć. W tej wskazówce SQL Server jest instalowany w osobnym środowisku.

Kroki instalacji programu SQL Server są pomijane, ponieważ są nadmiarowe. Poniższe strony zawierają wskazówki dotyczące programu SQL Server, więc jeśli chcesz wiedzieć, jak go skonfigurować, zapoznaj się z nim.

Tworzenie tabeli

Tym razem utworzymy następującą bazę danych i tabelę jako Pan/Pani.

  • Nazwa bazy danych: TestDatabase
  • Nazwa tabeli: Użytkownik
  • Kolumny tabeli: [ID], [Nazwa], [Hasło], [Wiek], [Email], [Urodziny], [UpdateDateTime]

Możesz go utworzyć w dowolny sposób, ale jeśli nie chcesz tego robić, uruchom następujący kod SQL względem SQL Server, aby go wygenerować.

Poniżej przedstawiono tworzenie bazy danych SQL, ale ponieważ ścieżka tworzenia bazy danych zmienia się w zależności od wersji itp., bardziej niezawodne może być utworzenie jej za pomocą GUI lub polecenia zamiast 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

Tworzenie 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

Rekord Dołącz 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

Konfiguracja programu Visual Studio

Zakładamy, że to również już skonfigurowałeś. Jeśli chcesz poznać procedurę konfiguracji itp., jest ona podsumowana na następnej stronie.

Tworzenie projektu

Entity Framework Core nie jest zależny od żadnego konkretnego środowiska wykonawczego, więc może być używany w wielu projektach. W tym artykule użyjemy programu Entity Framework Core w prostym środowisku aplikacji konsolowej.

W nowym projekcie wybierz pozycję Aplikacja konsolowa.

Projekt został utworzony. Nie ma znaczenia, jaka jest nazwa projektu.

Pobierz pakiet Entity Framework Core

Pobierz pakiet do korzystania z programu Entity Framework Core z programem NuGet.

Kliknij prawym przyciskiem myszy zależność i wybierz polecenie Zarządzaj pakietami NuGet.

Po wybraniu opcji "Przeglądaj" na karcie wpisz w EntityFrameworkCore polu wyszukiwania. Następnie na liście powinny zostać wyświetlone pakiety związane z programem Entity Framework Core.

Ponieważ tym razem będziemy korzystać z SQL Server, zainstalujemy następujące pakiety.

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

Microsoft.EntityFrameworkCore W tym przykładzie instalujemy plik . Zainstaluj również pozostałe dwa.

Wybierz miejsce docelowe instalacji i kliknij przycisk Zainstaluj. Jako wersję wybierz najnowszą stabilną.

Okno dialogowe jest w zasadzie OK i możesz kliknąć OK.

Zainstaluj również pozostałe dwa.

Myślę, że pakiet wygląda tak:

Tworzenie modelu (kodu) na podstawie struktury tabeli bazy danych

Aby model i inny kod zostały wygenerowane automatycznie, najpierw skompiluj projekt, aby upewnić się, że nie ma żadnych błędów. Jeśli wystąpi błąd, tworzenie modelu zakończy się niepowodzeniem. Jeśli masz już sprawdzone, że nie ma żadnych błędów, nie musisz go kompilować.

W programie Visual Studio otwórz konsolę Menedżer pakietów. Jeśli go nie masz, możesz go otworzyć z menu "Narzędzia", "Menedżer pakietów NuGet", "Konsola menedżera pakietów".

Zostanie wyświetlone następujące okno, więc upewnij się, że "Projekt domyślny" w prawym górnym rogu to projekt, dla którego chcesz utworzyć model. (Musisz być ostrożny, jeśli masz wiele projektów)

Wprowadź następujący tekst w polu wprowadzania: Parametry zmieniają się w zależności od środowiska, dlatego prosimy o ich zmianę zgodnie z poniższymi wyjaśnieniami w odpowiednim czasie.

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

Przykładowe dane wejściowe

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
Opis parametruPrzykład parametru
Dostawca W przypadku SQL Server jest to Microsoft.EntityFrameworkCore.SqlServer naprawione. Microsoft.EntityFrameworkCore.SqlServer
Połączenie Parametry połączenia do nawiązania połączenia z bazą danych. Parametry połączenia mogą być używane podobnie jak inne aplikacje, dlatego postępuj zgodnie z notacją parametrów połączenia dla zawartości, która ma zostać określona. Można użyć uwierzytelniania systemu Windows lub uwierzytelniania programu SQL Server. Nawiasem mówiąc, jest on używany tylko tymczasowo do tworzenia modelu, więc nie ma potrzeby zdawać sobie sprawy z zabezpieczeń po opublikowaniu aplikacji dla tego parametru połączenia. Jeśli w haśle znajdują się symbole, uważaj na ucieczkę. "Źródło danych=NazwaSerwera\SQLEXPRESS; Database=Baza danych testowych; user id=UserName; hasło=**********"
f Nawet jeśli program już istnieje, zostanie nadpisany na siłę. Brak <>
Katalog wyjściowy Ścieżka folderu, w którym chcesz wyprowadzić kod. Ścieżka względem folderu projektu Modele\Baza danych
Kontekst Nazwy klas kontekstowych podczas korzystania z platformy Entity Framework TestDatabaseDbContext
UseDatabaseNames (Nazwy baz danych) Jeśli zostanie określona, nazwa tabeli bazy danych będzie nazwą klasy w takiej postaci, w jakiej jest. Jeśli nie zostanie określona, wielkość liter w nazwie klasy jednostki zostanie dostosowana zgodnie z regułami. Brak <>
Adnotacje danych Po określeniu typ kolumny automatycznie dołącza atrybut DataAnnotation do każdej właściwości. Jest to nieco przydatne, jeśli chcesz automatycznie wykonywać kontrole danych wejściowych zgodnie z typem bazy danych. Brak <>
Przestrzeń nazw Przestrzeń nazw, do której należy wygenerowana klasa jednostki. Jeśli nie zostanie określony, przestrzeń nazw jest określana zgodnie z folderem. TestNamespace (Przestrzeń nazw testów)
ContextNamespace (ContextNamespace) Przestrzeń nazw, do której należy wygenerowany kontekst. Jeśli nie zostanie określony, przestrzeń nazw jest określana zgodnie z folderem. TestNamespace (Przestrzeń nazw testów)
NoOnKonfiguracja Nie osadzaj nieprzetworzonych parametrów połączenia w kodzie. Brak <>
NoPluralize Upewnij się, że nazwy właściwości dla każdej nazwy tabeli w kontekście nie są w liczbie mnogiej. Brak <>

Po naciśnięciu Enter, aby go uruchomić, kod zostanie wygenerowany automatycznie: Jeśli wystąpi błąd, zostanie wyświetlona przyczyna, więc odpowiedz zgodnie z treścią błędu.

User Kod modelu tabeli jest następujący.

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

Nawiasem mówiąc, ostrzeżenie jest wyświetlane, ponieważ parametry połączenia są zapisywane tak, jak w kodzie wygenerowanej klasy kontekstu. Jeśli to możliwe, parametry połączenia powinny być przechowywane w osobnym miejscu i ustawione w czasie wykonywania, ale w tym przypadku ma to na celu sprawdzenie operacji, więc zostawię ją taką, jaka jest.

Spróbuj pobrać i wyświetlić rekordy

Teraz, gdy mamy już kod umożliwiający dostęp do rekordów w bazie danych, spróbujmy pobrać rekordy i wyświetlić je w konsoli.

Program.cs i zmodyfikuj go w następujący sposób.

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

Wygeneruj automatycznie wygenerowaną DbContext klasę new w programie . Jest on zadeklarowany w, aby połączenia z bazą danych mogły using var zostać automatycznie zniszczone.

dbContext Generuje właściwości w celu uzyskania dostępu do każdego modelu, więc w tym przypadku User można manipulować rekordami w tabeli User , uzyskując dostęp do właściwości. Wystawiony kod SQL jest generowany automatycznie wewnętrznie i nie musi być zauważany.

ToList W tym przypadku metoda rozszerzenia jest używana do User pobierania wszystkich rekordów w tabeli.

foreach Reszta odbywa się za pomocą metod i JsonSerializer.Serialize do User wyświetlania informacji w konsoli. Jak User wspomniano powyżej, każda kolumna w tabeli jest zadeklarowana jako właściwość, więc możliwe jest pobranie wartości indywidualnie.