Ingeniería inversa

La ingeniería inversa es el proceso de scaffolding de clases de tipo de entidad y una clase DbContext basada en un esquema de base de datos. Se puede realizar mediante el comando de las herramientas de EF Core Administrador de paquetes Console (PMC) o el comando de las herramientas de la interfaz de la línea de comandos Scaffold-DbContextdotnet ef dbcontext scaffold (CLI) de .NET.

Instalación

Antes de la ingeniería inversa, deberá instalar las herramientas de PMC (solo Visual Studio) o las herramientas de la CLI. Consulte los vínculos para obtener más información.

También tendrá que instalar un proveedor de base de datos adecuado para el esquema de base de datos que desea realizar el ingeniero inverso.

Cadena de conexión

El primer argumento del comando es una cadena de conexión a la base de datos. Las herramientas usarán esta cadena de conexión para leer el esquema de la base de datos.

La forma de comillas y escape de la cadena de conexión depende del shell que se use para ejecutar el comando. Consulte la documentación del shell para obtener información específica. Por ejemplo, PowerShell requiere que se escape el $ carácter, pero no \ .

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

Configuración y secretos de usuario

Si tiene un proyecto ASP.NET Core, puede usar la sintaxis para leer la Name=<connection-string> cadena de conexión de la configuración.

Esto funciona bien con la herramienta Secret Manager para mantener la contraseña de la base de datos independiente del código base.

dotnet user-secrets set ConnectionStrings:Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook"
dotnet ef dbcontext scaffold Name=ConnectionStrings:Chinook Microsoft.EntityFrameworkCore.SqlServer

Nombre del proveedor

El segundo argumento es el nombre del proveedor. El nombre del proveedor suele ser el mismo que el nombre del paquete de NuGet proveedor.

Especificación de tablas

Todas las tablas del esquema de base de datos se diseñan de forma inversa en tipos de entidad de forma predeterminada. Puede limitar qué tablas se diseñan de forma inversa especificando esquemas y tablas.

La --schema opción se puede usar para incluir todas las tablas dentro de un esquema, mientras que se puede usar para incluir tablas --table específicas.

Para incluir varias tablas, especifique la opción varias veces:

dotnet ef dbcontext scaffold ... --table Artist --table Album

Conservación de nombres

Los nombres de tabla y columna se han corregido para que coincidan mejor con las convenciones de nomenclatura de .NET para tipos y propiedades de forma predeterminada. Si se especifica el modificador en PMC o la opción en el CLI de .NET Core se deshabilitará este comportamiento conservando los nombres de base de datos originales tanto -UseDatabaseNames--use-database-names como sea posible. Los identificadores de .NET no válidos seguirán siendo fijos y los nombres sintetizados, como las propiedades de navegación, se seguirán ajustando a las convenciones de nomenclatura de .NET.

Fluent API o anotaciones de datos

Los tipos de entidad se configuran mediante Fluent API de forma predeterminada. Especifique -DataAnnotations (PMC) o --data-annotations (CLI de .NET Core) para usar anotaciones de datos cuando sea posible.

Por ejemplo, al usar Fluent API, se scaffolding:

entity.Property(e => e.Title)
    .IsRequired()
    .HasMaxLength(160);

Al usar anotaciones de datos, se scaffolding:

[Required]
[StringLength(160)]
public string Title { get; set; }

Nombre de DbContext

El nombre de clase DbContext con scaffolding será el nombre de la base de datos con el sufijo Context de forma predeterminada. Para especificar otro, use -Context en PMC y --context en el CLI de .NET Core.

Directorios y espacios de nombres

Las clases de entidad y una clase DbContext se scaffolding en el directorio raíz del proyecto y usan el espacio de nombres predeterminado del proyecto.

Puede especificar el directorio donde las clases se scaffolding mediante y se puede usar para --output-dir scaffolding de la clase DbContext en un directorio independiente de las clases de tipo --context-dir de entidad:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

De forma predeterminada, el espacio de nombres será el espacio de nombres raíz más los nombres de los subdirectorios del directorio raíz del proyecto. Sin embargo, a partir de EFCore 5.0 en adelante, puede invalidar el espacio de nombres para todas las clases de salida mediante --namespace . También puede invalidar el espacio de nombres solo para la clase DbContext mediante --context-namespace :

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

Cómo funciona

La ingeniería inversa comienza leyendo el esquema de la base de datos. Lee información sobre tablas, columnas, restricciones e índices.

A continuación, usa la información de esquema para crear un EF Core modelo. Las tablas se usan para crear tipos de entidad; Las columnas se usan para crear propiedades; y las claves externas se usan para crear relaciones.

Por último, el modelo se usa para generar código. Las clases de tipo de entidad correspondientes, Fluent API y las anotaciones de datos se scaffolding para volver a crear el mismo modelo desde la aplicación.

Limitaciones

  • No todo lo que tiene que ver con un modelo se puede representar mediante un esquema de base de datos. Por ejemplo, la información sobre las jerarquías deherencia,los tipos de propiedad y la división de tablas no están presentes en el esquema de base de datos. Por este problema, estas construcciones nunca se diseñarán de forma inversa.
  • Además, es posible que algunos tipos de columna no sean compatibles con el proveedor EF Core columnas. Estas columnas no se incluirán en el modelo.
  • Puede definir tokens de simultaneidaden un EF Core para evitar que dos usuarios actualicen la misma entidad al mismo tiempo. Algunas bases de datos tienen un tipo especial para representar este tipo de columna (por ejemplo, rowversion en SQL Server), en cuyo caso se puede diseñar inversamente esta información; sin embargo, otros tokens de simultaneidad no se diseñarán de forma inversa.
  • Antes de EF Core 6, la característica de tipo de referencia que acepta valores NULL de C# 8 no era compatible con la ingeniería inversa: EF Core código de C# generado siempre que se supone que la característica está deshabilitada. Por ejemplo, las columnas de texto que aceptan valores NULL se han scaffolding como una propiedad con el tipo , no , con la API de Fluent o anotaciones de datos utilizadas para configurar si una propiedad es necesaria o stringstring? no. Si usa una versión anterior de EF Core, todavía puede editar el código con scaffolding y reemplazarlos por anotaciones de nulabilidad de C#.

Personalización del modelo

El código generado por EF Core es el código. No dude en cambiarlo. Solo se volverá a generar si vuelve a diseñar el mismo modelo de forma inversa. El código con scaffolding representa un modelo que se puede usar para acceder a la base de datos, pero ciertamente no es el único modelo que se puede usar.

Personalice las clases de tipo de entidad y la clase DbContext para que se adapten a sus necesidades. Por ejemplo, puede elegir cambiar el nombre de tipos y propiedades, introducir jerarquías de herencia o dividir una tabla en varias entidades. También puede quitar del modelo índices no únicos, secuencias sin usar y propiedades de navegación, propiedades escalares opcionales y nombres de restricción.

También puede agregar constructores adicionales, métodos, propiedades, etc. usar otra clase parcial en un archivo independiente. Este enfoque funciona incluso cuando se pretende volver a diseñar el modelo de forma inversa.

Actualización del modelo

Después de realizar cambios en la base de datos, es posible que tenga que actualizar el modelo EF Core para reflejar esos cambios. Si los cambios en la base de datos son sencillos, puede ser más fácil realizar manualmente los cambios en el EF Core modelo. Por ejemplo, cambiar el nombre de una tabla o columna, quitar una columna o actualizar el tipo de una columna son cambios triviales que se pueden realizar en el código.

Sin embargo, los cambios más significativos no son tan fáciles de realizar manualmente. Un flujo de trabajo común es volver a diseñar el modelo desde la base de datos mediante -Force (PMC) o (CLI) para sobrescribir el modelo existente --force con uno actualizado.

Otra característica que se solicita habitualmente es la capacidad de actualizar el modelo desde la base de datos a la vez que se conserva la personalización, como los cambios de nombre, las jerarquías de tipos, etc. Use el problema 831 para realizar un seguimiento del progreso de esta característica.

Advertencia

Si vuelve a diseñar el modelo desde la base de datos, se perderán los cambios realizados en los archivos.

Sugerencia

Si usa Visual Studio, la extensión de la comunidad de EF Core Power Tools, una herramienta gráfica que se basa en las herramientas de línea de comandos de EF Core, ofrece opciones de personalización y flujo de trabajo adicionales.