Preparar-se per accedir a l'SQL Server mitjançant l'Entity Framework Core (base de dades primer)
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.