Подготовка к доступу к SQL Server с помощью Entity Framework Core (сначала база данных)

Страница обновлена :
Дата создания страницы :

Операционная среда

Визуальная студия
  • Визуальная студия 2022
.СЕТЬ
  • .NET 8
Ядро Entity Framework
  • Ядро Entity Framework 8.0
SQL Server
  • SQL Server 2022

* Вышеуказанная среда является средой верификации, но она может работать и с другими версиями.

Сначала

Entity Framework Core — библиотека сопоставителей O/R. При доступе к базе данных вы можете получить доступ к записям базы данных через модели (классы), определенные в коде, без прямого использования SQL-операторов. Это дает следующие преимущества:

  • Поскольку SQL-операторы не записываются напрямую, риски безопасности, такие как SQL-инъекции, снижаются.
  • Так как SQL-операторы являются строками, то даже если вы допустите ошибку в синтаксисе, она не будет проверена на наличие ошибок при сборке, но так как модель является программным синтаксисом, вы можете проверить наличие ошибок во время сборки.

Entity Framework Core может автоматически генерировать код из существующих баз данных для подключения к этим моделям и базам данных. И наоборот, есть способ написать код вручную, а затем автоматически сгенерировать базу данных.

Первый называется "database-first", а второй - "code-first". Существует также принцип «сначала модель», который генерирует код и базы данных на основе схем, таких как ER-диаграммы, но он не широко используется в Entity Framework Core.

В этом случае мы будем использовать шаблон «сначала база данных», который генерирует код в предположении, что база данных уже существует.

Настройка SQL Server

Чтобы получить доступ к базе данных SQL Server в этом совете, настройте SQL Server заранее. Он может быть настроен на ПК в среде разработки или на другом ПК через сеть. Если вы можете подключиться к SQL Server из среды разработки, все в порядке. В этом совете SQL Server устанавливается в отдельной среде.

Шаги по настройке SQL Server опущены, так как они являются избыточными. Следующие страницы содержат советы, связанные с SQL Server, поэтому, если вы хотите узнать, как его настроить, обратитесь к ним.

Создание таблицы

На этот раз мы создадим следующую базу данных и таблицу в качестве мистера/мисс.

  • Имя базы данных: TestDatabase
  • Имя таблицы: User
  • Столбцы таблицы: [ID], [Имя], [Пароль], [Возраст], [Электронная почта], [День рождения], [Дата обновления]

Вы можете создать его любым способом, но если вы не хотите этого делать, запустите следующий 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 в простой среде консольных приложений.

В новом проекте выберите Консольное приложение.

Проект создан. При этом не имеет значения, как называется проект.

Получить пакет 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, и вы можете нажать OK.

Установите и два других.

Думаю, пакет выглядит так:

Создание модели (кода) из структуры таблицы базы данных

Чтобы модель и другой код были сгенерированы автоматически, сначала соберите проект, чтобы убедиться в отсутствии ошибок. Если произошла ошибка, создание модели завершается ошибкой. Если вы уже убедились, что ошибок нет, вам не нужно его собирать.

В Visual Studio откройте консоль диспетчера пакетов. Если у вас его нет, вы можете открыть его из меню "Сервис", "NuGet Package Manager", "Package Manager Console".

Отобразится следующее окно, поэтому убедитесь, что «Проект по умолчанию» в правом верхнем углу — это проект, для которого вы хотите создать модель. (Нужно быть осторожным, если у вас несколько проектов)

Введите в поле ввода следующий текст: Параметры меняются в зависимости от окружающей среды, поэтому своевременно изменяйте их в соответствии со следующими пояснениями.

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. Кстати, он используется только временно для создания модели, поэтому нет необходимости заботиться о безопасности после публикации приложения для этой строки подключения. Если в пароле есть символы, будьте осторожны с экранированием. "Data Source=ServerName\SQLEXPRESS; База данных = Тестовая база данных; идентификатор пользователя=ИмяПользователя; password=**********"
f Даже если программа уже существует, она будет принудительно перезаписана. Нет <>
OutputDir (ДиректорOutputDir) Путь к папке, в которую вы хотите вывести код. Путь относительно папки проекта Модели\База данных
Контекст Имена классов контекста при использовании Entity Framework TestDatabaseDbContext
UseDatabaseNames Если указано, имя таблицы базы данных будет именем класса как оно есть. Если не указано, регистр имени класса сущности корректируется в соответствии с правилами. Нет <>
Аннотации к данным Если тип столбца указан, к каждому свойству автоматически добавляется атрибут DataAnnotation. Это немного полезно, если вы хотите автоматически выполнять проверки ввода в соответствии с типом базы данных. Нет <>
Пространство имен Пространство имен, к которому принадлежит сгенерированный класс сущности. Если не указано, пространство имен определяется в соответствии с папкой. TestNamespace (Пространство имен TestName)
ContextNamespace (КонтекстNamespace) Пространство имен, к которому принадлежит сгенерированный контекст. Если не указано, пространство имен определяется в соответствии с папкой. TestNamespace (Пространство имен TestName)
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 Остальное делается с помощью методов and JsonSerializer.Serialize для User отображения информации на консоли. Как User упоминалось выше, каждый столбец в таблице объявлен как свойство, поэтому можно получить значение по отдельности.