Preparare l'accesso a SQL Server utilizzando Entity Framework Core (database-first)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente operativo

Studio visivo
  • Studio visivo 2022
.RETE
  • .NET 8
Nucleo di Entity Framework
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* Quanto sopra è un ambiente di verifica, ma potrebbe funzionare con altre versioni.

Dapprima

Entity Framework Core è una libreria di mappatori O/R. Quando si accede al database, è possibile accedere ai record del database tramite modelli (classi) definiti nel codice, senza utilizzare direttamente le istruzioni SQL. Ciò offre i seguenti vantaggi:

  • Poiché le istruzioni SQL non vengono scritte direttamente, i rischi per la sicurezza, come l'SQL injection, sono ridotti.
  • Poiché le istruzioni SQL sono stringhe, anche se si commette un errore nella sintassi, non viene verificata la presenza di errori di compilazione, ma poiché il modello è una sintassi di programma, è possibile verificare la presenza di errori in fase di compilazione.

Entity Framework Core è in grado di generare automaticamente codice da database esistenti per connettersi a questi modelli e database. Al contrario, c'è un modo per scrivere il codice manualmente e quindi generare automaticamente il database.

Il primo è chiamato "database-first" e il secondo è chiamato "code-first". C'è anche il "model-first", che genera codice e database da progetti come i diagrammi ER, ma non è ampiamente utilizzato in Entity Framework Core.

In questo caso, utilizzeremo un modello "database-first" che genera codice presupponendo che il database esista già.

Configurazione di SQL Server

Per accedere al database SQL Server in questo suggerimento, configurare SQL Server in anticipo. Può essere configurato su un PC nell'ambiente di sviluppo o su un altro PC tramite la rete. Se è possibile connettersi a SQL Server dall'ambiente di sviluppo, è possibile eseguire l'operazione. In questo suggerimento, SQL Server viene installato in un ambiente separato.

I passaggi di configurazione di SQL Server vengono omessi perché sono ridondanti. Le pagine seguenti contengono suggerimenti relativi a SQL Server, quindi se vuoi sapere come configurarlo, fai riferimento ad esso.

Creare una tabella

Questa volta, creeremo il seguente database e la tabella come Sig./Sig.ra.

  • Nome database: TestDatabase
  • Nome tabella: Utente
  • Colonne della tabella: [ID], [Nome], [Password], [Età], [E-mail], [Compleanno], [UpdateDateTime]

È possibile crearlo in qualsiasi modo, ma se non si desidera farlo, eseguire il seguente SQL su SQL Server per generarlo.

Quello che segue è SQL per la creazione del database, ma poiché il percorso di creazione del database cambia a seconda della versione, ecc., potrebbe essere più affidabile crearlo con GUI o comando invece di 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

Creazione di tabelle 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

Record Append 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

Installazione di Visual Studio

Supponiamo che tu abbia già configurato anche questo. Se vuoi conoscere la procedura di configurazione, ecc., è riassunta nella pagina seguente.

Creare un progetto

Entity Framework Core non dipende da alcun ambiente di esecuzione specifico, pertanto può essere utilizzato in molti progetti. In questo articolo verrà usato Entity Framework Core in un semplice ambiente di applicazione console.

Nel nuovo progetto, seleziona App console.

Il progetto è stato creato. Non importa quale sia il nome del progetto.

Ottenere il pacchetto Entity Framework Core

Ottenere un pacchetto per l'uso di Entity Framework Core con NuGet.

Fare clic con il pulsante destro del mouse sulla dipendenza e scegliere Gestisci pacchetti NuGet.

Con l'opzione "Sfoglia" selezionata dalla scheda, accedere al campo di EntityFrameworkCore ricerca. Nell'elenco dovrebbero quindi essere visualizzati i pacchetti correlati a Entity Framework Core.

Poiché questa volta utilizzeremo SQL Server, installeremo i seguenti pacchetti.

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

Microsoft.EntityFrameworkCore In questo esempio, stiamo installando . Installa anche gli altri due.

Selezionare la destinazione di installazione e fare clic sul pulsante Installa. Per la versione, selezionare l'ultima versione stabile.

La finestra di dialogo è fondamentalmente OK e puoi fare clic su OK.

Installa anche gli altri due.

Penso che il pacchetto assomigli a questo:

Creare un modello (codice) da una struttura di tabella di database

Per generare automaticamente il modello e altro codice, compilare prima il progetto per assicurarsi che non siano presenti errori. Se si verifica un errore, la creazione del modello non riesce. Se è già stato verificato che non sono presenti errori, non è necessario compilarlo.

Da Visual Studio aprire la console di Gestione pacchetti. Se non ne hai uno, puoi aprirlo dal menu "Strumenti", "Gestione pacchetti NuGet", "Console di Gestione pacchetti".

Verrà visualizzata la seguente finestra, quindi assicurati che il "Progetto predefinito" nell'angolo in alto a destra sia il progetto per il quale desideri creare un modello. (Devi stare attento se hai più progetti)

Inserire il seguente testo nel campo di immissione: I parametri cambiano a seconda dell'ambiente, quindi si prega di modificarli in base alle seguenti spiegazioni in modo tempestivo.

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

Input di esempio

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
Descrizione del parametroEsempio di parametro
Provider Per SQL Server, è Microsoft.EntityFrameworkCore.SqlServer fisso. Microsoft.EntityFrameworkCore.SqlServer
Connessione Stringa di connessione per la connessione al database. Le stringhe di connessione possono essere utilizzate in comune con altre app, quindi segui la notazione delle stringhe di connessione per i contenuti da specificare. È possibile utilizzare l'autenticazione di Windows o l'autenticazione di SQL Server. A proposito, viene utilizzato solo temporaneamente per creare un modello, quindi non è necessario essere consapevoli della sicurezza dopo aver pubblicato l'applicazione per questa stringa di connessione. Se nella password sono presenti dei simboli, fare attenzione a non scappare. "Fonte dati=Nome server\SQLEXPRESS; Database=TestDatabase; user id=NomeUtente; password=**********"
f Anche se il programma esiste già, verrà sovrascritto forzatamente. Nessun <>
OutputDir Percorso della cartella in cui si desidera generare il codice. Percorso relativo alla cartella del progetto Modelli\Banca dati
Contesto Nomi delle classi di contesto quando si utilizza Entity Framework TestDatabaseDbContext
UseDatabaseNames Se specificato, il nome della tabella del database sarà il nome della classe così com'è. Se non specificato, la distinzione tra maiuscole e minuscole del nome della classe di entità viene regolata in base alle regole. Nessun <>
DataAnnotations Se specificato, il tipo di colonna aggiunge automaticamente l'attributo DataAnnotation a ogni proprietà. Questo è un po' utile se si desidera eseguire automaticamente i controlli di input in base al tipo di database. Nessun <>
Spazio dei nomi Spazio dei nomi a cui appartiene la classe di entità generata. Se non specificato, lo spazio dei nomi viene determinato in base alla cartella. Spazio dei nomi di prova
ContextNamespace Spazio dei nomi a cui appartiene l'oggetto Context generato. Se non specificato, lo spazio dei nomi viene determinato in base alla cartella. Spazio dei nomi di prova
NoOnConfiguring Non incorporare stringhe di connessione non elaborate nel codice. Nessun <>
NoPluralize Assicurarsi che i nomi delle proprietà per ogni nome di tabella nel contesto non siano pluralizzati. Nessun <>

Quando si preme Invio per eseguirlo, il codice viene generato automaticamente: Se si verifica un errore, verrà visualizzato il motivo, quindi si prega di rispondere in base al contenuto dell'errore.

User Il codice del modello della tabella è il seguente.

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

A proposito, l'avviso viene visualizzato perché la stringa di connessione è scritta così com'è nel codice della classe di contesto generata. Se possibile, la stringa di connessione dovrebbe essere memorizzata in un luogo separato e impostata in fase di esecuzione, ma in questo caso è allo scopo di controllare l'operazione, quindi la lascerò così com'è.

Prova a recuperare e visualizzare i record

Ora che abbiamo il codice per accedere ai record nel database, proviamo a recuperare i record e a visualizzarli sulla console.

Program.cs e modificarlo come segue.

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

Generare la classe new generata DbContext automaticamente in . Viene dichiarato in modo che le connessioni al database possano using var essere eliminate automaticamente.

dbContext Genera proprietà per accedere a ciascun modello, quindi in questo caso User è possibile modificare i record nella tabella User accedendo alle proprietà. Il codice SQL emesso viene generato automaticamente internamente e non deve essere notato.

ToList In questo caso, viene utilizzato un metodo di estensione per User recuperare tutti i record nella tabella.

foreach Il resto viene fatto utilizzando i metodi e JsonSerializer.Serialize per User visualizzare le informazioni sulla console. Come User accennato in precedenza, ogni colonna della tabella viene dichiarata come proprietà, quindi è possibile recuperare il valore singolarmente.