Preparar-se per accedir a l'SQL Server mitjançant l'Entity Framework Core (base de dades primer)

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn operatiu

Visual Studio
  • Visual Studio 2022
.XARXA
  • .NET 8
Nucli de l'Entity Framework
  • Entity Framework Core 8.0
Servidor SQL
  • SQL Server 2022

* L'anterior és un entorn de verificació, però pot funcionar amb altres versions.

Al principi

Entity Framework Core és una biblioteca de mapeadors d'O/R. Quan s'accedeix a la base de dades, es pot accedir als registres de la base de dades mitjançant models (classes) definits en codi, sense utilitzar sentències SQL directament. Això proporciona els següents avantatges:

  • Com que les sentències SQL no s'escriuen directament, es redueixen els riscos de seguretat com la injecció SQL.
  • Com que les sentències SQL són cadenes, fins i tot si cometeu un error en la sintaxi, no es comprova si hi ha errors de construcció, però com que el model és una sintaxi de programa, podeu comprovar si hi ha errors en temps de construcció.

L'Entity Framework Core pot generar automàticament codi a partir de bases de dades existents per connectar-se a aquests models i bases de dades. Per contra, hi ha una manera d'escriure el codi manualment i després generar automàticament la base de dades.

El primer s'anomena "base de dades primer" i el segon s'anomena "codi primer". També hi ha "model-first", que genera codi i bases de dades a partir de plànols com els diagrames ER, però no s'utilitza àmpliament a Entity Framework Core.

En aquest cas, utilitzarem un patró "base de dades primer" que genera codi suposant que la base de dades ja existeix.

Instal·lació de l'SQL Server

Per accedir a la base de dades de l'SQL Server en aquest consell, configureu l'SQL Server amb antelació. Es pot configurar en un ordinador en l'entorn de desenvolupament o en un altre ordinador a través de la xarxa. Si us podeu connectar a l'SQL Server des del vostre entorn de desenvolupament, ja esteu a punt. En aquest consell, l'SQL Server s'instal·la en un entorn independent.

Els passos d'instal·lació de l'SQL Server s'ometen perquè són redundants. Les pàgines següents contenen consells relacionats amb SQL Server, de manera que si voleu saber com configurar-lo, consulteu-lo.

Crear una taula

Aquesta vegada, crearem la següent base de dades i taula com a Sr. / Sra.

  • Nom de la base de dades: TestDatabase
  • Nom de la taula: Usuari
  • Columnes de la taula: [ID], [Nom], [Contrasenya], [Edat], [Correu electrònic], [Aniversari], [UpdateDateTime]

Podeu crear-lo de qualsevol manera, però si no voleu fer-ho, executeu el següent SQL contra SQL Server per generar-lo.

El següent és SQL de creació de bases de dades, però com que el camí de creació de la base de dades canvia segons la versió, etc., pot ser més fiable crear-lo amb GUI o ordre en lloc d'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

Creació de taules 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

Afegeix el registre 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

Instal·lació del Visual Studio

Suposem que ja ho heu configurat també. Si voleu conèixer el procediment de configuració, etc., es resumeix a la pàgina següent.

Crear un projecte

L'Entity Framework Core no depèn de cap entorn d'execució en particular, de manera que es pot utilitzar en molts projectes. En aquest article, utilitzarem l'Entity Framework Core en un entorn d'aplicació de consola senzill.

Al projecte nou, seleccioneu Aplicació de consola.

El projecte ha estat creat. No importa quin sigui el nom del projecte.

Obtenir el paquet principal de l'Entity Framework

Obteniu un paquet per utilitzar l'Entity Framework Core amb el NuGet.

Feu clic amb el botó dret a la dependència i seleccioneu Administra els paquets NuGet.

Amb "Navegar" seleccionat a la pestanya, introduïu al camp de EntityFrameworkCore cerca. A continuació, hauríeu de veure els paquets relacionats amb l'Entity Framework Core a la llista.

Com que aquesta vegada utilitzarem SQL Server, instal·larem els paquets següents.

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

Microsoft.EntityFrameworkCore En aquest exemple, estem instal·lant . Instal·leu també els altres dos.

Seleccioneu l'objectiu d'instal·lació i feu clic al botó Instal·la. Per a la versió, seleccioneu l'últim estable.

El diàleg és bàsicament correcte i podeu fer clic a D'acord.

Instal·leu també els altres dos.

Crec que el paquet es veu així:

Crear un model (codi) a partir d'una estructura de taula de base de dades

Per generar el model i altres codis automàticament, primer construïu el projecte per assegurar-vos que no hi hagi errors. Si hi ha un error, la creació del model falla. Si ja heu verificat que no hi ha errors, no cal que el creeu.

Des del Visual Studio, obriu la consola del gestor de paquets. Si no en teniu, podeu obrir-lo des del menú "Eines", "Gestor de paquets NuGet", "Consola del gestor de paquets".

Es mostrarà la següent finestra, així que assegureu-vos que el "Projecte predeterminat" a la cantonada superior dreta és el projecte per al qual voleu crear un model. (Cal anar amb compte si tens diversos projectes)

Introduïu el text següent al camp d'entrada: Els paràmetres canvien en funció de l'entorn, així que canvieu-los segons les explicacions següents de manera oportuna.

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

Exemple d'entrada

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
Descripció del paràmetreExemple de paràmetre
Proveïdor Per a SQL Server, és fix.Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.SqlServer
Connexió La cadena de connexió per connectar-se a la base de dades. Les cadenes de connexió es poden utilitzar en comú amb altres aplicacions, així que seguiu la notació de cadenes de connexió per especificar el contingut. Podeu utilitzar l'autenticació del Windows o l'autenticació de l'SQL Server. Per cert, només s'utilitza temporalment per crear un model, de manera que no cal tenir en compte la seguretat després de publicar l'aplicació per a aquesta cadena de connexió. Si teniu símbols a la contrasenya, aneu amb compte de no escapar-los. "Font de dades=NomServidor\SQLEXPRESS; Base de dades=Base de dades de prova; id d'usuari = Nom d'usuari; contrasenya = **********"
f Fins i tot si el programa ja existeix, se sobreescriurà per la força. No <>
Direcció de sortida El camí de la carpeta on voleu generar el codi. Camí relatiu a la carpeta del projecte Models\Base de dades
Context Noms de classe de context quan s'utilitza l'Entity Framework TestDatabaseDbContext
NomsBase de dades d'ús Si s'especifica, el nom de la taula de la base de dades serà el nom de la classe tal com és. Si no s'especifica, el nom de la classe d'entitat s'ajusta segons les regles. No <>
Anotacions de dades Quan s'especifica, el tipus de columna afegeix automàticament l'atribut DataAnnotation a cada propietat. Això és una mica útil si voleu realitzar comprovacions d'entrada automàticament segons el tipus de base de dades. No <>
Espai de noms L'espai de noms al qual pertany la classe d'entitat generada. Si no s'especifica, l'espai de noms es determina segons la carpeta. Espai de noms de prova
ContextNamespace L'espai de noms al qual pertany el context generat. Si no s'especifica, l'espai de noms es determina segons la carpeta. Espai de noms de prova
NoOnConfiguring No incrusteu cadenes de connexió en brut al codi. No <>
NoPluralize Assegureu-vos que els noms de propietat de cada nom de taula al context no estiguin pluralitzats. No <>

Quan premeu Retorn per executar-lo, el codi es genera automàticament: Si es produeix un error, es mostrarà el motiu, així que responeu segons el contingut de l'error.

User El codi del model de la taula és el següent.

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

Per cert, l'avís es mostra perquè la cadena de connexió s'escriu tal com està en el codi de la classe de context generada. Si és possible, la cadena de connexió s'ha d'emmagatzemar en un lloc separat i configurar-la en temps d'execució, però en aquest cas, és amb l'objectiu de comprovar el funcionament, de manera que la deixaré tal com està.

Proveu de recuperar i mostrar registres

Ara que tenim el codi per accedir als registres de la base de dades, provem de recuperar els registres i mostrar-los a la consola.

Program.cs i modifiqueu-lo de la següent manera.

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

Genera la classe new generada DbContext automàticament al . Es declara en de manera que les connexions a la base de dades es puguin using var destruir automàticament.

dbContext genera propietats per accedir a cada model, de manera que en aquest cas User , podeu manipular els registres de la taula accedint User a les propietats. L'SQL que s'emet es genera automàticament internament i no cal notar-lo.

ToList Aquí s'utilitza un mètode d'extensió per User recuperar tots els registres de la taula.

foreach La resta es fa mitjançant els mètodes i JsonSerializer.Serialize per mostrar la informació a User la consola. Com User s'ha esmentat anteriorment, cada columna de la taula es declara com a propietat, de manera que és possible recuperar el valor individualment.