Creazione di DbContext in fase di progettazione

Alcuni comandi degli strumenti di EF Core, ad esempio i comandi Migrations, richiedono la creazione di un'istanza derivata in fase di progettazione per raccogliere informazioni dettagliate sui tipi di entità dell'applicazione e sul modo in cui vengono mappati a uno schema del database. Nella maggior parte dei casi, è consigliabile che l'oggetto creato sia configurato in modo simile a come verrebbe configurato DbContextDbContext

Esistono diversi modi in cui gli strumenti provano a creare DbContext :

Da servizi dell'applicazione

Se il progetto di avvio usa l'host Web ASP.NET Core o l'host generico .NET Core,gli strumenti tentano di ottenere l'oggetto DbContext dal provider di servizi dell'applicazione.

Gli strumenti provano prima a ottenere il provider di servizi richiamando Program.CreateHostBuilder() , chiamando , quindi Build() accedendo alla proprietà Services .

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

Quando si crea una nuova applicazione ASP.NET Core, questo hook è incluso per impostazione predefinita.

DbContextL'oggetto stesso e tutte le dipendenze nel costruttore devono essere registrati come servizi nel provider di servizi dell'applicazione. Questa operazione può essere facilmente ottenuta con un costruttore nell'oggetto che accetta un'istanza di DbContextOptions<TContext> come argomento e usando il DbContextOptions<TContext>.

Uso di un costruttore senza parametri

Se non è possibile ottenere DbContext dal provider di servizi dell'applicazione, gli strumenti cercano il tipo DbContext derivato all'interno del progetto. Prova quindi a creare un'istanza usando un costruttore senza parametri. Può trattarsi del costruttore predefinito se DbContext l'oggetto è configurato utilizzando il OnConfiguring metodo .

Da una factory in fase di progettazione

È anche possibile indicare agli strumenti come creare l'oggetto DbContext implementando l'interfaccia > TContext Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory: se una classe che implementa questa interfaccia si trova nello stesso progetto del progetto derivato o nel progetto di avvio dell'applicazione, gli strumenti ignorano le altre modalità di creazione di DbContext e usano invece la factory della fase di DbContext progettazione.

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

Prima di EFCore 5.0 il args parametro non era usato (vedere questo args Questo problema è stato risolto in EFCore 5.0 e gli eventuali argomenti aggiuntivi della fase di progettazione vengono passati all'applicazione tramite tale parametro.

Una factory della fase di progettazione può essere particolarmente utile se è necessario configurare in modo diverso per la fase di progettazione che in fase di esecuzione, se il costruttore accetta parametri aggiuntivi non viene registrato nell'disarticolato, se non si usa l'interfaccia della distribuzione per qualche motivo o se per qualche motivo si preferisce non avere un metodo nella classe DbContextDbContextCreateHostBuilder dell'applicazione Main ASP.NET Core.

Args

Entrambi IDesignTimeDbContextFactory TContext > . CreateDbContext e accettare Program.CreateHostBuilder gli argomenti della riga di comando.

A partire EF Core 5.0, è possibile specificare questi argomenti dagli strumenti:

dotnet ef database update -- --environment Production

Il token indica a di considerare tutto ciò che segue come argomento e di non --dotnet ef tentare di analizzarli come opzioni. Eventuali argomenti aggiuntivi non usati da dotnet ef vengono inoltrati all'app.