Przygotowanie do uzyskiwania dostępu do programu SQL Server przy użyciu programu Entity Framework Core (najpierw baza danych)
Ś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.