Подгответе се за достъп до SQL Server с помощта на Entity Framework Core (първо база данни)

Страницата се актуализира :
Дата на създаване на страница :

Работна среда

Визуално студио
  • Visual Studio 2022
.НЕТЕН
  • .NET 8
Ядро на рамката на обекта
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* Горното е среда за проверка, но може да работи и с други версии.

Отначало

Entity Framework Core е библиотека от O/R mappers. Когато осъществявате достъп до базата данни, можете да осъществявате достъп до записите на базата данни чрез модели (класове), дефинирани в код, без да използвате SQL инструкции директно. Това осигурява следните предимства:

  • Тъй като SQL инструкциите не се пишат директно, рисковете за сигурността, като например SQL инжектиране, са намалени.
  • Тъй като SQL инструкциите са низове, дори и да направите грешка в синтаксиса, той не се проверява за грешки в компилацията, но тъй като моделът е програмен синтаксис, можете да проверите за грешки по време на компилацията.

Entity Framework Core може автоматично да генерира код от съществуващи бази данни, за да се свърже с тези модели и бази данни. Обратно, има начин да напишете кода ръчно и след това автоматично да генерирате базата данни.

Първият се нарича "първо база данни", а вторият се нарича "първо код". Има и "модел на първо място", който генерира код и бази данни от чертежи като ER диаграми, но не се използва широко в Entity Framework Core.

В този случай ще използваме шаблон "на първо място база данни", който генерира код с предположението, че базата данни вече съществува.

Настройка на SQL Server

За да получите достъп до базата данни на SQL Server в този съвет, моля, настройте SQL Server предварително. Може да се настрои на компютър в средата за разработка или на друг компютър чрез мрежата. Ако можете да се свържете с SQL Server от вашата среда за разработка, можете да започнете. В този съвет SQL Server се инсталира в отделна среда.

Стъпките за настройка на SQL Server са пропуснати, защото са излишни. Следващите страници съдържат съвети, свързани с SQL Server, така че ако искате да знаете как да го настроите, моля, вижте го.

Създаване на таблица

Този път ще създадем следната база данни и таблица като г-н/г-жа.

  • Име на базата данни: TestDatabase
  • Име на таблицата: Потребител
  • Колони на таблицата: [ID], [Име], [Парола], [Възраст], [Имейл], [Рожден ден], [UpdateDateTime]

Можете да го създадете по всякакъв начин, но ако не искате да го правите, стартирайте следния SQL срещу SQL Server, за да го генерирате.

Следва SQL за създаване на база данни, но тъй като пътят на създаване на база данни се променя в зависимост от версията и т.н., може да е по-надеждно да я създадете с GUI или команда вместо 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

Вземете пакет за използване на Entity Framework Core с NuGet.

Щракнете с десния бутон върху зависимостта и изберете Управление на NuGet пакети.

Когато "Преглед" е избран от раздела, въведете в полето за EntityFrameworkCore търсене. След това трябва да видите пакетите, свързани с ядрото на Entity Framework в списъка.

Тъй като този път ще използваме SQL Server, ще инсталираме следните пакети.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore В този пример инсталираме . Инсталирайте и другите два.

Изберете целта за инсталиране и щракнете върху бутона Инсталиране. За версията изберете най-новата стабилна.

Диалоговият прозорец е по принцип ОК и можете да щракнете върху 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. Между другото, той се използва само временно за създаване на модел, така че няма нужда да сте наясно със сигурността след публикуване на приложението за този низ за връзка. Ако имате символи в паролата си, внимавайте да не избягате. "Източник на данни=Име на сървъра\SQLEXPRESS; База данни=Тестова база данни; user id=Потребителско име; password=**********"
f Дори ако програмата вече съществува, тя ще бъде принудително презаписана. Няма <>
ИзходДиректор Пътят на папката, където искате да изведете кода. Път спрямо папката на проекта Модели\База данни
Контекста Имена на контекстни класове при използване на рамката на обекта TestDatabaseDbContext
UseDatabaseNames Ако е посочено, името на таблицата на базата данни ще бъде името на класа такова, каквото е. Ако не е посочено, случаят с името на класа на обекта се коригира в съответствие с правилата. Няма <>
ДанниАнотации Когато е посочен, типът на колоната автоматично добавя атрибута DataAnnotation към всяко свойство. Това е малко полезно, ако искате автоматично да извършвате входни проверки според типа на базата данни. Няма <>
Namespace Пространството от имена, към което принадлежи генерираният клас на обекта. Ако не е посочено, пространството от имена се определя според папката. Пространство от имена на TestNamespace
ContextNamespace Пространството от имена, към което принадлежи генерираният контекст. Ако не е посочено, пространството от имена се определя според папката. Пространство от имена на TestNamespace
NoOnКонфигуриране Не вграждайте необработени низове за връзка във вашия код. Няма <>
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 бе споменато по-горе, всяка колона в таблицата е декларирана като свойство, така че е възможно стойността да се извлече поотделно.