Förbereda för åtkomst till SQL Server med hjälp av Entity Framework Core (databas först)
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.