Creación de DbContext en tiempo de diseño

Algunos de los comandos de EF Core Tools (por ejemplo, los comandos de migraciones) requieren que se cree una instancia derivada en tiempo de diseño para recopilar detalles sobre los tipos de entidad de la aplicación y cómo se asignan a un esquema de base de datos. En la mayoría de los casos, es conveniente que el que se crea se configure de forma similar a como se DbContextDbContext

Hay varias maneras en que las herramientas intentan crear DbContext :

Desde servicios de aplicación

Si el proyecto de inicio usa el host web de ASP.NET Core o el host genérico de .NET Core,las herramientas intentan obtener el objeto DbContext del proveedor de servicios de la aplicación.

En primer lugar, las herramientas intentan obtener el proveedor de servicios invocando Program.CreateHostBuilder() , llamando a y Build() accediendo a la Services propiedad .

public class Program
{
    public static void Main(string[] args)
        => CreateHostBuilder(args).Build().Run();

    // EF Core uses this method at design time to access the DbContext
    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(
                webBuilder => webBuilder.UseStartup<Startup>());
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Nota

Al crear una nueva aplicación ASP.NET Core, este enlace se incluye de forma predeterminada.

El DbContext propio y todas las dependencias de su constructor deben registrarse como servicios en el proveedor de servicios de la aplicación. Esto se puede lograr fácilmente si se tiene un constructor en que toma una instancia de como DbContextOptions<TContext> argumento y se usa el DbContextOptions<TContext>.

Uso de un constructor sin parámetros

Si no se puede obtener DbContext del proveedor de servicios de aplicación, las herramientas buscan el tipo DbContext derivado dentro del proyecto. A continuación, intentan crear una instancia mediante un constructor sin parámetros. Puede ser el constructor predeterminado si se DbContext configura mediante el método OnConfiguring .

Desde una factoría en tiempo de diseño

También puede decir a las herramientas cómo crear dbContext mediante la implementación de la interfaz TContext > Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory: si una clase que implementa esta interfaz se encuentra en el mismo proyecto que el derivado o en el proyecto de inicio de la aplicación, las herramientas omiten las otras formas de crear el DbContext y usan el generador en tiempo de diseño en su DbContext lugar.

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
    public BloggingContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlite("Data Source=blog.db");

        return new BloggingContext(optionsBuilder.Options);
    }
}

Nota

Antes de EFCore 5.0, args el parámetro no se usaba (vea este args Esto se ha corregido en EFCore 5.0 y los argumentos adicionales en tiempo de diseño se pasan a la aplicación a través de ese parámetro.

Un generador en tiempo de diseño puede ser especialmente útil si necesita configurar de forma diferente para el tiempo de diseño que en tiempo de ejecución, si el constructor toma parámetros adicionales no están registrados en la inserción de inserción de recursos, si no usa la inserción de contenido o si, por algún motivo, prefiere no tener un método en la clase de la aplicación DbContextDbContext de CreateHostBuilderMain ASP.NET Core.

Args

IDesignTimeDbContextFactory TContext > . CreateDbContext yProgram.CreateHostBuilder acepte argumentos de línea de comandos.

A partir EF Core 5.0, puede especificar estos argumentos desde las herramientas:

dotnet ef database update -- --environment Production

El token dirige a tratar todo lo que sigue como argumento y no intentar --dotnet ef analizarlos como opciones. Los argumentos adicionales que no usa dotnet ef se reenvía a la aplicación.