Preparación para acceder a SQL Server mediante Entity Framework Core (base de datos primero)

Actualización de la página :
Fecha de creación de la página :

Entorno operativo

Estudio visual
  • Visual Studio 2022
.RED
  • .NET 8
Núcleo de Entity Framework
  • Entity Framework Core 8.0
Servidor SQL
  • SQL Server 2022

* Lo anterior es un entorno de verificación, pero puede funcionar con otras versiones.

Al principio

Entity Framework Core es una biblioteca de asignadores de O/R. Al acceder a la base de datos, puede acceder a los registros de la base de datos a través de modelos (clases) definidos en código, sin usar instrucciones SQL directamente. Esto proporciona los siguientes beneficios:

  • Dado que las sentencias SQL no se escriben directamente, se reducen los riesgos de seguridad, como la inyección de código SQL.
  • Dado que las sentencias SQL son cadenas, incluso si se comete un error en la sintaxis, no se comprueban los errores de compilación, pero dado que el modelo es una sintaxis de programa, se pueden comprobar los errores en tiempo de compilación.

Entity Framework Core puede generar automáticamente código a partir de bases de datos existentes para conectarse a estos modelos y bases de datos. Por el contrario, hay una manera de escribir el código manualmente y luego generar automáticamente la base de datos.

El primero se denomina "base de datos primero" y el segundo se denomina "código primero". También existe "model-first", que genera código y bases de datos a partir de planos técnicos como diagramas ER, pero no se usa ampliamente en Entity Framework Core.

En este caso, usaremos un patrón de "base de datos primero" que genera código asumiendo que la base de datos ya existe.

Configuración de SQL Server

Para acceder a la base de datos de SQL Server en este consejo, configure SQL Server con anticipación. Se puede configurar en un PC en el entorno de desarrollo o en otro PC a través de la red. Si puede conectarse a SQL Server desde su entorno de desarrollo, está listo para comenzar. En esta sugerencia, SQL Server se instala en un entorno independiente.

Los pasos de instalación de SQL Server se omiten porque son redundantes. Las siguientes páginas contienen consejos relacionados con SQL Server, por lo que si desea saber cómo configurarlo, consúltelo.

Crear una tabla

Esta vez, crearemos la siguiente base de datos y tabla como Sr./Sra.

  • Nombre de la base de datos: TestDatabase
  • Nombre de la tabla: Usuario
  • Columnas de la tabla: [ID], [Nombre], [Contraseña], [Edad], [Correo electrónico], [Fecha de nacimiento], [UpdateDateTime]

Puede crearlo de cualquier manera, pero si no desea hacerlo, ejecute el siguiente SQL en SQL Server para generarlo.

La siguiente es la creación de bases de datos SQL, pero dado que la ruta de creación de bases de datos cambia según la versión, etcétera, puede ser más confiable crearla con GUI o comando en lugar de 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ón de tablas 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

Anexar registros 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

Configuración de Visual Studio

Suponemos que ya lo ha configurado también. Si desea conocer el procedimiento de configuración, etcétera, se resume en la siguiente página.

Crear un proyecto

Entity Framework Core no depende de ningún entorno de ejecución en particular, por lo que se puede usar en muchos proyectos. En este artículo, usaremos Entity Framework Core en un entorno de aplicación de consola simple.

En el nuevo proyecto, seleccione Aplicación de consola.

El proyecto ha sido creado. No importa cuál sea el nombre del proyecto.

Obtener el paquete básico de Entity Framework

Obtenga un paquete para usar Entity Framework Core con NuGet.

Haga clic con el botón secundario en la dependencia y seleccione Administrar paquetes NuGet.

Con "Examinar" seleccionado en la pestaña, ingrese en el campo de EntityFrameworkCore búsqueda. A continuación, debería ver los paquetes relacionados con Entity Framework Core en la lista.

Dado que esta vez usaremos SQL Server, instalaremos los siguientes paquetes.

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

Microsoft.EntityFrameworkCore En este ejemplo, estamos instalando archivos . Instala también los otros dos.

Seleccione el destino de instalación y haga clic en el botón Instalar. Para la versión, seleccione la estable más reciente.

El cuadro de diálogo es básicamente OK y puede hacer clic en Aceptar.

Instala también los otros dos.

Creo que el paquete se ve así:

Crear un modelo (código) a partir de una estructura de tabla de base de datos

Para que el modelo y el resto del código se generen automáticamente, primero compile el proyecto para asegurarse de que no haya errores. Si se produce un error, se produce un error en la creación del modelo. Si ya ha verificado que no hay errores, no es necesario que lo compile.

En Visual Studio, abra la consola del Administrador de paquetes. Si no tiene uno, puede abrirlo desde el menú "Herramientas", "Administrador de paquetes NuGet", "Consola del administrador de paquetes".

Se mostrará la siguiente ventana, así que asegúrese de que el "Proyecto predeterminado" en la esquina superior derecha sea el proyecto para el que desea crear un modelo. (Debes tener cuidado si tienes varios proyectos)

Introduzca el siguiente texto en el campo de entrada: Los parámetros cambian según el entorno, así que cámbielos de acuerdo con las siguientes explicaciones de manera oportuna.

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

Entrada de ejemplo

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ón del parámetroEjemplo de parámetro
Proveedor Para SQL Server, es Microsoft.EntityFrameworkCore.SqlServer fijo. Microsoft.EntityFrameworkCore.SqlServer
Conexión Cadena de conexión para conectarse a la base de datos. Las cadenas de conexión se pueden usar en común con otras aplicaciones, así que siga la notación de cadenas de conexión para especificar el contenido. Puede usar la autenticación de Windows o la autenticación de SQL Server. Por cierto, solo se usa temporalmente para crear un modelo, por lo que no es necesario tener en cuenta la seguridad después de publicar la aplicación para esta cadena de conexión. Si tiene símbolos en su contraseña, tenga cuidado de no escapar. "Fuente de datos=NombredelServidor\SQLEXPRESS; Base de Datos=Base de Datos de Prueba; id de usuario=Nombre de usuario; contraseña=**********"
f Incluso si el programa ya existe, se sobrescribirá a la fuerza. No <>
OutputDir La ruta de acceso de la carpeta en la que desea generar el código. Ruta de acceso relativa a la carpeta del proyecto Modelos\Base de datos
Contexto Nombres de clase de contexto al usar Entity Framework TestDatabaseDbContext
UseDatabaseNames Si se especifica, el nombre de la tabla de la base de datos será el nombre de la clase tal cual. Si no se especifica, las mayúsculas y minúsculas del nombre de la clase de entidad se ajustan según las reglas. No <>
DataAnnotations Cuando se especifica, el tipo de columna anexa automáticamente el atributo DataAnnotation a cada propiedad. Esto es un poco útil si desea realizar automáticamente comprobaciones de entrada según el tipo de base de datos. No <>
Namespace El espacio de nombres al que pertenece la clase de entidad generada. Si no se especifica, el espacio de nombres se determina de acuerdo con la carpeta. TestNamespace (Espacio de nombres de prueba)
ContextNamespace (Espacio de nombres de contexto) El espacio de nombres al que pertenece el contexto generado. Si no se especifica, el espacio de nombres se determina de acuerdo con la carpeta. TestNamespace (Espacio de nombres de prueba)
NoOnConfiguring No insertes cadenas de conexión sin procesar en el código. No <>
NoPluralizar Asegúrese de que los nombres de propiedad de cada nombre de tabla en el contexto no estén pluralizados. No <>

Al pulsar Intro para ejecutarlo, el código se genera automáticamente: Si se produce un error, se mostrará el motivo, así que responda de acuerdo con el contenido del error.

User El código del modelo de la tabla es el siguiente.

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

Por cierto, la advertencia se muestra porque la cadena de conexión se escribe tal cual en el código de la clase de contexto generada. Si es posible, la cadena de conexión debe almacenarse en un lugar separado y establecerse en tiempo de ejecución, pero en este caso, es con el propósito de verificar la operación, por lo que lo dejaré como está.

Intente recuperar y mostrar registros

Ahora que tenemos el código para acceder a los registros de la base de datos, intentemos recuperar los registros y mostrarlos en la consola.

Program.cs y modificarlo de la siguiente 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));
}

Genere la clase new generada DbContext automáticamente en . Se declara para que las conexiones de la base de datos se puedan using var destruir automáticamente.

dbContext Genera propiedades para acceder a cada modelo, por lo que en este caso User , puede manipular los registros de la tabla accediendo User a las propiedades. El SQL que se emite se genera automáticamente internamente y no es necesario que se note.

ToList Aquí, se utiliza un método de extensión para User recuperar todos los registros de la tabla.

foreach El resto se realiza utilizando los métodos y JsonSerializer.Serialize para User mostrar la información en la consola. Como User se mencionó anteriormente, cada columna de la tabla se declara como una propiedad, por lo que es posible recuperar el valor individualmente.