Förbereda för åtkomst till SQL Server med hjälp av Entity Framework Core (databas först)

Sidan uppdaterad :
Datum för skapande av sida :

Omvärld

Visuell studio
  • Visual Studio 2022
.NÄT
  • .NET 8
Kärna för entitetsramverk
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* Ovanstående är en verifieringsmiljö, men den kan fungera med andra versioner.

Först

Entity Framework Core är ett bibliotek med O/R-mappningar. När du öppnar databasen kan du komma åt databasens poster via modeller (klasser) som definieras i kod, utan att använda SQL-uttryck direkt. Detta ger följande fördelar:

  • Eftersom SQL-satser inte skrivs direkt minskar säkerhetsrisker som SQL-inmatning.
  • Eftersom SQL-satser är strängar, även om du gör ett misstag i syntaxen, kontrolleras det inte för byggfel, men eftersom modellen är en programsyntax kan du kontrollera om det finns fel vid byggtiden.

Entity Framework Core kan automatiskt generera kod från befintliga databaser för att ansluta till dessa modeller och databaser. Omvänt finns det ett sätt att skriva koden manuellt och sedan automatiskt generera databasen.

Den förstnämnda kallas "databas-först" och den senare kallas "kod-först". Det finns också "model-first", som genererar kod och databaser från skisser som ER-diagram, men det används inte i stor utsträckning i Entity Framework Core.

I det här fallet kommer vi att använda ett "databas-först"-mönster som genererar kod under antagandet att databasen redan finns.

Installation av SQL Server

För att komma åt SQL Server-databasen i det här tipset, konfigurera SQL Server i förväg. Den kan ställas in på en PC i utvecklingsmiljön eller på en annan PC via nätverket. Om du kan ansluta till SQL Server från din utvecklingsmiljö är du redo att börja. I det här tipset installeras SQL Server i en separat miljö.

Installationsstegen för SQL Server utelämnas eftersom de är redundanta. Följande sidor innehåller SQL Server-relaterade tips, så om du vill veta hur du ställer in det, se det.

Skapa en tabell

Den här gången kommer vi att skapa följande databas och tabell som en Mr./Ms..

  • Databasens namn: TestDatabase
  • Tabellnamn: Användare
  • Tabellkolumner: [ID], [Namn], [Lösenord], [Ålder], [E-post], [Födelsedag], [UpdateDateTime]

Du kan skapa den på vilket sätt som helst, men om du inte vill göra det kör du följande SQL mot SQL Server för att generera den.

Följande är SQL, men eftersom sökvägen för att skapa databasen ändras beroende på version etc. kan det vara mer tillförlitligt att skapa den med GUI eller kommando istället för 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 för att skapa tabeller.

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

Spela in Lägg till 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

Konfiguration av Visual Studio

Vi antar att du redan har ställt in detta också. Om du vill veta hur du ställer in etc. sammanfattas det på följande sida.

Skapa ett projekt

Entity Framework Core är inte beroende av någon särskild körningsmiljö, så den kan användas i många projekt. I den här artikeln använder vi Entity Framework Core i en enkel konsolprogrammiljö.

I det nya projektet väljer du Konsolapp.

Projektet har skapats. Det spelar ingen roll vad projektet heter.

Hämta Entity Framework Core-paketet

Hämta ett paket för att använda Entity Framework Core med NuGet.

Högerklicka på beroendet och välj Hantera NuGet-paket.

Med "Bläddra" valt på fliken anger du i EntityFrameworkCore sökfältet. Du bör sedan se de Entity Framework Core-relaterade paketen i listan.

Eftersom vi kommer att använda SQL Server den här gången kommer vi att installera följande paket.

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

Microsoft.EntityFrameworkCore I det här exemplet installerar vi . Installera de andra två också.

Välj installationsmål och klicka på knappen Installera. För versionen väljer du den senaste stabila utgåvan.

Dialogrutan är i princip OK och du kan klicka på OK.

Installera de andra två också.

Jag tycker att paketet ser ut så här:

Skapa en modell (kod) från en databastabellstruktur

Om du vill att modellen och annan kod ska genereras automatiskt skapar du först projektet för att se till att det inte finns några fel. Om det uppstår ett fel går det inte att skapa modellen. Om du redan har kontrollerat att det inte finns några fel behöver du inte skapa den.

Från Visual Studio öppnar du Package Manager-konsolen. Om du inte har någon kan du öppna den från menyn "Verktyg", "NuGet Package Manager", "Package Manager Console".

Följande fönster kommer att visas, så se till att "Standardprojekt" i det övre högra hörnet är det projekt som du vill skapa en modell för. (Du måste vara försiktig om du har flera projekt)

Ange följande text i inmatningsfältet: Parametrarna ändras beroende på miljön, så ändra dem enligt följande förklaringar i tid.

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Exempel på indata

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
Parameter descriptionParameter exempel
Familjeförsörjare För SQL Server är det Microsoft.EntityFrameworkCore.SqlServer åtgärdat. Microsoft.EntityFrameworkCore.SqlServer
Samband Συμβολοσειρά σ� Συμβολοσειρά σύνδεσης kan användas gemensamt med andra appar, så följ notationen för συμβολοσειρά σύνδεσ Du kan använda antingen Windows-autentisering eller SQL Server-autentisering. Förresten, den används bara tillfälligt för att skapa en modell, så det finns ingen anledning att vara medveten om säkerheten när du har publicerat programmet för den här anslutningssträngen. Om du har symboler i ditt lösenord ska du vara försiktig så att du inte flyr. "Data Source=Servernamn\SQLEXPRESS; Database=TestDatabase; användar-id=Användarnamn; password=**********"
f Även om programmet redan finns kommer det att skrivas över med tvång. Inget <>
OutputDir Mappsökvägen där du vill mata ut koden. Sökväg i förhållande till projektmappen Modeller\Databas
Sammanhang Kontextklassnamn när du använder Entity Framework TestDatabaseDbContext
UseDatabaseNames (på engelska) Om det anges blir tabellnamnet för databasen klassnamnet som det är. Om inget anges justeras skiftläget för enhetsklassens namn enligt reglerna. Inget <>
DataAnnoteringar När det anges lägger kolumntypen automatiskt till attributet DataAnnotation i varje egenskap. Detta är lite användbart om du automatiskt vill utföra inmatningskontroller beroende på typ av databas. Inget <>
Namnrymd Det namnområde som den genererade entitetsklassen tillhör. Om inget anges bestäms namnområdet enligt mappen. TestNamespace (på engelska)
Kontextnamnrymd Det namnområde som den genererade kontexten tillhör. Om inget anges bestäms namnområdet enligt mappen. TestNamespace (på engelska)
NoOnKonfigurera Bädda inte in råa anslutningssträngar i koden. Inget <>
NejPluralisera Se till att egenskapsnamnen för varje tabellnamn i kontexten inte är pluraliserade. Inget <>

När du trycker på Retur för att köra den genereras koden automatiskt: Om ett fel inträffar kommer orsaken att visas, så svara enligt felinnehållet.

User Tabellens modellkod är följande.

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; }
}

Förresten, varningen visas eftersom anslutningssträngen är skriven som den är i koden för den genererade kontextklassen. Om möjligt bör συμβολοσειρά σύνδεσης lagras på en separat plats och ställas in vid körning, men i det här fallet är det för att kontrollera åtgärden, så jag lämnar det som det är.

Prova att hämta och visa poster

Nu när vi har koden för att komma åt posterna i databasen ska vi försöka hämta posterna och visa dem på konsolen.

Program.cs och ändra den enligt följande.

// 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));
}

Generera den automatiskt genererade DbContext klassen new i . Den deklareras i så att databasanslutningar kan using var förstöras automatiskt.

dbContext Genererar egenskaper för att komma åt varje modell, så i det här fallet User kan du manipulera posterna i tabellen genom User att komma åt egenskaperna. Den SQL som utfärdas genereras automatiskt internt och behöver inte märkas.

ToList Här används en tilläggsmetod för att User hämta alla poster i tabellen.

foreach Resten görs med hjälp av metoderna och JsonSerializer.Serialize för att User visa informationen på konsolen. Som User nämnts ovan deklareras varje kolumn i tabellen som en egenskap, så det är möjligt att hämta värdet individuellt.