Preparación para acceder a MySQL con Entity Framework Core (base de datos primero)

Fecha de creación de la página :

Entorno de confirmación de operaciones

Estudio visual
  • Visual Studio 2022
.RED
  • .NET 8
Núcleo de Entity Framework
  • Entity Framework Core 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

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

Al principio

Entity Framework Core es una biblioteca de asignadores de O/R que le permiten acceder a los registros de la base de datos a través de modelos definidos por código (clases) sin escribir directamente instrucciones SQL al acceder a la base de datos. Esto proporciona los siguientes beneficios:

  • No escribe instrucciones SQL directamente, lo que reduce los riesgos de seguridad, como la inyección de SQL
  • Dado que las sentencias SQL son cadenas, incluso si cometen un error en la sintaxis, no están sujetas a la comprobación de errores de compilación, pero como el modelo es una sintaxis de programa, se puede comprobar si hay errores en el momento de la compilación.

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

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

Esta vez, usaremos un patrón de "base de datos primero" que genera código en el supuesto de que ya existe una base de datos.

Configuración de MySQL

En este consejo, asegúrese de configurar MySQL de antemano para acceder a su base de datos MySQL. Se puede configurar en un PC en su entorno de desarrollo o en otro PC a través de la red. Si puede conectarse a MySQL desde su entorno de desarrollo, está listo para comenzar. En este consejo, hemos instalado MySQL en un entorno diferente.

Se omitirán los pasos de configuración de MySQL, ya que serán redundantes. Las siguientes páginas contienen consejos relacionados con MySQL para los pasos de configuración.

Crear una tabla

En este caso, crearemos el siguiente esquema (base de datos) y tabla como ejemplo.

  • Nombre del esquema: test_schema
  • Nombre de la tabla : usuario
  • Columnas de la tabla: [id], [nombre], [contraseña], [edad], [correo electrónico], [cumpleaños], [is_provisional_registration], [update_datetime]

No importa cómo lo escribas, pero si es tedioso, ejecuta y genera el siguiente SQL contra MySQL:

A continuación se muestra la creación de esquemas SQL:

CREATE DATABASE `test_schema`;

La creación de tablas es SQL.

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `is_provisional_registration` tinyint(1) NOT NULL,
  `update_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';

Agregar un registro a SQL.

INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');

Establecer permisos para tu cuenta

Asegúrese de tener un nombre de host configurado para que la cuenta que programa pueda acceder al esquema MySQL.

También debe establecer permisos para acceder a test_schema la cuenta a la que desea conectarse.

Esta vez, realizaremos SELECT el proceso de recuperación de los registros. No lo haré esta vez, pero si desea INSERT UPDATE insertar o actualizar, verifique y .

Configuración de Visual Studio

Suponiendo que ya lo hayas configurado también. Si desea conocer el procedimiento de configuración, lo hemos resumido en la siguiente página.

Crear un proyecto

Entity Framework Core no depende de un entorno de ejecución específico, por lo que se puede usar en muchos proyectos. En este caso, usaremos Entity Framework Core en un entorno de aplicación de consola simple.

En el nuevo proyecto, seleccione Aplicación de consola (lo que no sea .NET Framework).

Ha creado el proyecto. El nombre del proyecto puede ser cualquier cosa.

Obtener el paquete de Entity Framework Core para MySQL

Obtenga un paquete para usar Entity Framework Core con NuGet. El paquete usa: Esto no es oficial de Microsoft, pero es ampliamente utilizado.

  • Pomelo.EntityFrameworkCore.MySql

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

Con "Examinar" seleccionado en la pestaña, escriba en el campo Pomelo de búsqueda . Se mostrará la lista de paquetes relacionados.

Instale los siguientes paquetes desde esto:

  • Pomelo.EntityFrameworkCore.MySql

Seleccione lo que desea instalar y haga clic en el botón Instalar. Seleccione la última versión estable para la versión.

El diálogo está básicamente bien y bien.

Creo que el paquete es el siguiente.

Luego escriba EntityFrameworkCore en el campo de búsqueda e instale también lo siguiente.

  • Microsoft.EntityFrameworkCore.Tools

Para las versiones, Pomelo.EntityFrameworkCore.MySql haga coincidir la versión a la que Microsoft.EntityFrameworkCore hace referencia . Esta vez nos referimos a 8.0.2, así que Microsoft.EntityFrameworkCore.Tools hagámoslo 8.0.2 también. Este paquete se usa para generar código a partir de la base de datos.

Al final, debería verse así:

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

Para que el modelo y otro código se generen automáticamente, primero debe compilar el proyecto para asegurarse de que no haya errores. Si hay un error, se producirá un error en el modelo. Si ya ha verificado que no hay errores, no necesita compilar.

Abra la consola del Administrador de paquetes desde Visual Studio. Si no es así, puede abrirlo desde el menú Herramientas, Administrador de paquetes NuGet y Consola del Administrador de paquetes.

Verá una ventana como la que se muestra a continuación, así que asegúrese de que el "Proyecto predeterminado" en la esquina superior derecha sea el proyecto para el que desea crear el modelo. (Debe tener cuidado si tiene varios proyectos)

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

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Ejemplo de entrada

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Explicación de parámetros Ejemplo de parámetro
Proveedor Si es Pomelo.EntityFrameworkCore.MySql MySQL, especifique como. Pomelo.EntityFrameworkCore.MySql
Conexión Esta es la cadena de conexión que se va a conectar a la base de datos. La cadena de conexión se puede usar en otras aplicaciones, así que escriba el contenido especificado de acuerdo con la notación de la cadena de conexión. 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 un símbolo en su contraseña, tenga cuidado con el escape. "Servidor = Servidor de prueba; Base de datos = test_schema; usuario=usuario-prueba; contraseña = XXXXXXXX;"
f Forzar sobrescritura incluso si ya tiene un programa. Sin <>
DirectorioDeSalida La ruta de acceso de la carpeta para generar el código. Ruta relativa desde 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 en la base de datos será el nombre de la clase tal como está. Si no es así, el caso del nombre de la clase de entidad se ajusta de acuerdo con las reglas. Sin <>
Anotaciones de datos Si 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 la verificación de entrada de acuerdo con el tipo de base de datos. Sin <>
Namespace El espacio de nombres al que pertenece la clase de entidad generada. Si no se especifica, el espacio de nombres se determina según la carpeta. Espacio de nombres de prueba
ContextNamespace El espacio de nombres al que pertenece el contexto generado. Si no se especifica, el espacio de nombres se determina según la carpeta. Espacio de nombres de prueba
NoOnConfiguring Evite incrustar cadenas de conexión sin procesar en el código. Sin <>
NoPluralizar Evite el nombre de propiedad plural de cada nombre de tabla en el contexto. Sin <>

Presione Enter para ejecutarlo y generar automáticamente el código: Si se trata de un error, se mostrará el motivo, así que responda de acuerdo con el contenido del error.

user El código de modelo de la tabla tiene el siguiente aspecto:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SetupMysqlDatabaseFirst.Models.Database;

/// <summary>
/// テストコメント
/// </summary>
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; }

  public int? age { get; set; }

  [StringLength(200)]
  public string? email { get; set; }

  public DateOnly? birthday { get; set; }

  public bool is_provisional_registration { get; set; }

  [Column(TypeName = "datetime")]
  public DateTime? update_datetime { 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 esta vez es con el propósito de verificar la operación, por lo que la dejaré como está.

Obtener un registro y verlo

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

Program.cs y modifíquelo de la siguiente manera.

using SetupMysqlDatabaseFirst.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 DbContext clase new generada automáticamente con . Se declara en para permitir que using var la conexión de la base de datos se destruya automáticamente.

dbContext ha generado propiedades para acceder a cada modelo, por lo que esta vez user puede manipular los registros de la tabla accediendo User a las propiedades. No es necesario que tenga en cuenta el SQL que se emite porque se genera automáticamente internamente.

ToList Aquí estamos usando user un método de extensión para obtener todos los registros de la tabla.

foreach Después de eso, utilizo user los métodos y JsonSerializer.Serialize para 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 también es posible recuperar el valor individualmente.