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