Підготовка до доступу до 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 зазначалося вище, кожен стовпець у таблиці оголошується як властивість, тому є можливість отримати значення окремо.