Integración de Entity Framework Core con MSBuild

A partir de EF 9, puede usar una tarea de MSBuild para generar el modelo compilado y las consultas precompiladas automáticamente cuando se compila el proyecto o cuando se publica. Esto está pensado principalmente para su uso con la publicación NativeAOT.

Advertencia

La compatibilidad con NativeAOT y la integración de MSBuild son características experimentales y aún no son adecuadas para su uso en producción.

Instalación de las tareas

Para empezar, instale el Microsoft. EntityFrameworkCore.Tasks paquete NuGet. Por ejemplo:

dotnet add package Microsoft.EntityFrameworkCore.Tasks

Nota:

Todos los proyectos que deben compilarse con archivos generados deben hacer referencia al paquete NuGet, no es transitivo de forma predeterminada.

Uso de las tareas

Si el proyecto especifica <PublishAot>true</PublishAot> entonces, de forma predeterminada, la tarea MSBuild generará un modelo compilado y consultas precompiladas durante la publicación. De lo contrario, puede establecer las siguientes propiedades para controlar el comportamiento de generación:

Propiedad de MSBuild Descripción
EFOptimizeContext Establézcalo en true para habilitar la integración de MSBuild. EF Core 9-10 únicamente; eliminado en EF Core 11.
EFScaffoldModelStage Establezca en publisho buildnone para indicar en qué fase se generará el modelo compilado. Tiene como valor predeterminado publish.
EFPrecompileQueriesStage Establezca en publish, build o none para indicar en qué etapa se generarán las consultas precompiladas. Tiene como valor predeterminado publish.
DbContextName Clase derivada DbContext que se va a usar. Nombre de clase solo o completo con espacios de nombres. Si se omite esta opción, EF Core realizará la generación para todas las clases de contexto del proyecto.
EFTargetNamespace Espacio de nombres que se va a usar para todas las clases generadas. Si se omite esta opción, EF Core usará $(RootNamespace).
EFOutputDir Carpeta en la que se colocarán los archivos generados antes de compilar el proyecto. Si se omite esta opción, EF Core usará $(IntermediateOutputPath).
EFNullable Si se utilizarán tipos de referencia nulos en el código generado. Si se omite esta opción, EF Core usará $(Nullable).

Nota:

A partir de EF Core 11, la propiedad EFOptimizeContext ha sido eliminada. Las EFScaffoldModelStage propiedades y EFPrecompileQueriesStage ahora funcionan de forma independiente y no requieren una marca de habilitación adicional.

Limitaciones

  • Al utilizar la integración durante la etapa publish, establezca también el rid en el proyecto de inicio (por ejemplo, <RuntimeIdentifierwin>x64</RuntimeIdentifier>)
  • No se puede especificar un proyecto de inicio diferente al usar este enfoque, ya que introduciría una dependencia inversa de compilación. Esto significa que el proyecto de contexto debe ser autosuficiente en términos de configuración, por lo que si la aplicación normalmente configura el contexto mediante un generador de hosts en un proyecto diferente, tendría que implementar IDesignTimeDbContextFactory<TContext> en el proyecto de contexto.
  • Dado que el proyecto debe compilarse antes de que se genere el modelo compilado, este enfoque no admite implementaciones parciales de métodos para la personalización del modelo compilado.
  • Actualmente, esto siempre generará código adicional en el modelo compilado necesario para NativeAOT. Si no planea habilitar NativeAOT, genere el modelo compilado mediante las herramientas de la CLI.

Recursos adicionales