Підготовка до доступу до SQL Server за допомогою Entity Framework Core (на базі даних)
Робоче середовище
- Візуальна студія
-
- Visual Studio 2022
- .МЕРЕЖІ
-
- .NET 8
- Структурне ядро сутностей
-
- Entity Framework Core 8.0
- SQL Сервер
-
- SQL Server 2022
* Вище наведено середовище верифікації, але воно може працювати і з іншими версіями.
На перших порах
Entity Framework Core — це бібліотека O/R картографів. При зверненні до бази даних можна звертатися до записів бази даних через моделі (класи), визначені в коді, без використання SQL-виразів безпосередньо. Це дає наступні переваги:
- Оскільки SQL-вирази не пишуться безпосередньо, ризики безпеки, такі як SQL-ін'єкції, знижуються.
- Так як SQL-вирази - це рядки, то навіть якщо ви допустите помилку в синтаксисі, він не перевіряється на помилки збірки, але так як модель є синтаксисом програми, ви можете перевірити на наявність помилок під час збірки.
Entity Framework Core може автоматично генерувати код з існуючих баз даних для підключення до цих моделей і баз даних. І навпаки, є спосіб написати код вручну, а потім автоматично згенерувати базу даних.
Перший називається "database-first", а другий - "code-first". Існує також "model-first", який генерує код і бази даних з креслень, таких як діаграми ER, але він не широко використовується в Entity Framework Core.
У цьому випадку ми будемо використовувати шаблон "database-first", який генерує код у припущенні, що база даних вже існує.
Налаштування SQL Server
Щоб отримати доступ до бази даних SQL Server у цій пораді, будь ласка, налаштуйте SQL Server заздалегідь. Його можна налаштувати на ПК в середовищі розробки або на іншому ПК через мережу. Якщо ви можете підключитися до SQL Server зі свого середовища розробки, все готово. У цій підказці SQL Server встановлюється в окреме середовище.
Кроки налаштування SQL Server опускаються, оскільки вони є зайвими. Наступні сторінки містять поради, пов'язані з SQL Server, тому, якщо ви хочете дізнатися, як його налаштувати, зверніться до них.
Створити таблицю
Цього разу ми створимо наступну базу даних і таблицю як Mr./Ms..
- Ім'я бази даних: TestDatabase
- Ім'я таблиці: Користувач
- Стовпці таблиці: [ID], [Ім'я], [Пароль], [Вік], [Email], [День народження], [UpdateDateTime]
Ви можете створити його будь-яким способом, але якщо ви не хочете цього робити, запустіть наступний SQL проти SQL Server, щоб згенерувати його.
Нижче наведено створення баз даних SQL, але так як шлях створення бази даних змінюється в залежності від версії і т.д., може бути більш надійним її створення з графічним інтерфейсом або командою, а не з 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.
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
Запис Додавання 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
Ми припускаємо, що ви вже налаштували і це. Якщо ви хочете дізнатися про процедуру налаштування тощо, вона коротко описана на наступній сторінці.
Створити проект
Entity Framework Core не залежить від якогось конкретного середовища виконання, тому його можна використовувати в багатьох проектах. У цій статті ми будемо використовувати Entity Framework Core в простому середовищі консольних додатків.
У новому проекті виберіть Console App.
Проект створено. Не має значення, як називається проект.
Отримати пакет Entity Framework Core
Отримайте пакет для використання Entity Framework Core з NuGet.
Клацніть залежність правою кнопкою миші та виберіть «Керування пакетами NuGet».
Вибравши на вкладці «Огляд», введіть у поле пошуку EntityFrameworkCore
. Після цього ви повинні побачити в списку пакети, пов'язані з Entity Framework Core.
Оскільки цього разу ми будемо використовувати SQL Server, ми встановимо наступні пакети.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
У цьому прикладі ми встановлюємо . Встановіть також два інших.
Виберіть ціль встановлення та натисніть кнопку Встановити. Для версії виберіть останню стабільну версію.
Діалогове вікно в основному в порядку, і ви можете натиснути кнопку OK.
Встановіть також два інших.
Я думаю, що упаковка виглядає так:
Створення моделі (коду) зі структури таблиці бази даних
Щоб модель та інший код генерувалися автоматично, спочатку побудуйте проект, щоб переконатися у відсутності помилок. Якщо є помилка, створення моделі не вдається. Якщо ви вже переконалися у відсутності помилок, вам не потрібно його збирати.
У Visual Studio відкрийте консоль диспетчера пакетів. Якщо у вас його немає, ви можете відкрити його з меню «Інструменти», «Менеджер пакетів NuGet», «Консоль менеджера пакетів».
З'явиться наступне вікно, тому переконайтеся, що "Проект за замовчуванням" в правому верхньому кутку - це проект, для якого ви хочете створити модель. (Вам потрібно бути обережним, якщо у вас кілька проектів)
Введіть наступний текст у поле введення: Параметри змінюються в залежності від навколишнього середовища, тому, будь ласка, своєчасно змінюйте їх відповідно до наведених нижче пояснень.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Приклад вхідних даних
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
Опис параметраПриклад | параметра | |
---|---|---|
Постачальника | Для SQL Server це Microsoft.EntityFrameworkCore.SqlServer фіксовано. |
Microsoft.EntityFrameworkCore.SqlServer |
Підключення | Рядок підключення для підключення до бази даних. Рядки з'єднання можна використовувати спільно з іншими програмами, тому, будь ласка, дотримуйтесь позначення рядків з'єднання, щоб вказати. Ви можете використовувати автентифікацію Windows або автентифікацію SQL Server. До речі, він використовується лише тимчасово для створення моделі, тому немає необхідності знати про безпеку після публікації програми для цього рядка підключення. Якщо у вашому паролі є символи, будьте обережні, щоб не втекти. | "Джерело даних=Ім'яСервера\SQLEXPRESS; База даних=Тестова база даних; user id=Ім'я користувача; password=**********" |
f | Навіть якщо програма вже існує, вона буде примусово перезаписана. | Без <> |
OutputDir | Шлях до папки, куди ви хочете вивести код. Шлях відносно папки проекту | Моделі\База даних |
Контексті | Імена контекстних класів при використанні фреймворку сутностей | TestDatabaseDbContext |
UseDatabaseNames | Якщо вказано, то ім'я таблиці бази даних буде ім'ям класу в тому вигляді, в якому воно є. Якщо не вказано, то регістр імені класу сутності коригується відповідно до правил. | Без <> |
Анотації даних | Коли вказано, тип стовпця автоматично додає атрибут DataAnnotation до кожної властивості. Це трохи корисно, якщо ви хочете автоматично виконувати перевірки вхідних даних відповідно до типу бази даних. | Без <> |
Простір імен | Простір імен, до якого належить згенерований клас сутності. Якщо не вказано, простір імен визначається відповідно до папки. | Простір назв TestNames |
ContextNamespace | Простір імен, до якого належить згенерований Контекст. Якщо не вказано, простір імен визначається відповідно до папки. | Простір назв TestNames |
NoOnConfiguring | Не вбудовуйте необроблені рядки з'єднання у свій код. | Без <> |
NoPluralize | Переконайтеся, що імена властивостей для кожного імені таблиці в контексті не пишуться у множині. | Без <> |
Коли ви натискаєте Enter, щоб запустити його, код генерується автоматично: Якщо виникне помилка, буде відображено причину, тому, будь ласка, дайте відповідь відповідно до вмісту помилки.
User
Код моделі таблиці виглядає наступним чином.
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; }
}
До речі, попередження виводиться тому, що рядок підключення записується так, як він є в коді згенерованого контекстного класу. Якщо можливо, рядок підключення повинен зберігатися в окремому місці і задаватися під час виконання, але в даному випадку це з метою перевірки роботи, тому я залишу все як є.
Спробуйте отримати та відобразити записи
Тепер, коли у нас є код для доступу до записів у базі даних, давайте спробуємо отримати записи та відобразити їх на консолі.
Program.cs
і модифікувати його наступним чином.
// 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));
}
Згенеруйте автоматично згенерований DbContext
клас new
у форматі . Він оголошується для того, щоб з'єднання з базою даних могли using var
бути автоматично знищені.
dbContext
генерує властивості для доступу до кожної моделі, тому в цьому випадку User
ви можете маніпулювати записами в таблиці User
, звертаючись до властивостей.
SQL, який видається, автоматично генерується внутрішньо і його не потрібно помічати.
ToList
Тут використовується метод розширення для User
отримання всіх записів у таблиці.
foreach
Все інше робиться за допомогою методів і JsonSerializer.Serialize
для User
відображення інформації на консолі.
Як User
зазначалося вище, кожен стовпець у таблиці оголошується як властивість, тому є можливість отримати значення окремо.