Création de DbContext au moment de la conception
Certaines des commandes EF Core Tools (par exemple, les commandes Migrations) nécessitent la création d’une instance DbContext
dérivée au moment de la conception afin de recueillir des détails sur les types d’entités de l’application et leur mappage à un schéma de base de données. Dans la plupart des cas, il est souhaitable que le DbContext
créé soit configuré d’une manière semblable à celle de la configuration au moment de l’exécution.
Les outils essaient de créer de diverses manières DbContext
:
À partir des services d’application
Si votre projet de démarrage utilise l’hôte web ASP.NET Core ou l’hôte générique .NET Core, les outils essaient d’obtenir l’objet DbContext auprès du fournisseur de services de l’application.
Les outils essaient d’abord d’obtenir le fournisseur en faisant appel à Program.CreateHostBuilder()
, en appelant Build()
, puis en accédant à la propriété 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)
{
}
}
Remarque
Ce hook est inclus par défaut lorsque vous créez une application ASP.NET Core.
Le DbContext
et les dépendances de son constructeur doivent être inscrits en tant que services dans le fournisseur de services de l’application. Cela peut être facilement obtenu en ayant un constructeur sur le DbContext
qui prend une instance de DbContextOptions<TContext>
comme argument , à l’aide de la AddDbContext<TContext>
méthode.
Utilisation d’un constructeur sans paramètre
Si le dbContext ne peut pas être obtenu à partir du fournisseur de services de l’application, les outils recherchent le type dérivé DbContext
dans le projet. Ils essaient par la suite de créer une instance à l’aide d’un constructeur sans paramètre. Il peut s’agir du constructeur par défaut si le DbContext
est configuré à l’aide de la méthode OnConfiguring
.
À partir d’une fabrique au moment de la conception
Vous pouvez également indiquer aux outils comment créer votre DbContext en implémentant l’interface Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> : si une classe implémentant ladite interface se trouve dans le même projet que le projet dérivé DbContext
(ou dans le projet de démarrage de l’application), les outils contournent les autres façons de créer dbContext et utilisent plutôt la fabrique au moment de la conception.
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);
}
}
Une fabrique au moment de la conception peut être particulièrement utile si vous devez configurer DbContext
différemment selon qu’il s’agit du moment de la conception ou du moment de l’exécution, si le constructeur DbContext
accepte des paramètres supplémentaires ne sont pas enregistrés dans un DI, si vous n’utilisez absolument pas de DI, ou si, pour une raison quelconque, vous préférez ne pas avoir de méthode CreateHostBuilder
dans la classe Main
de votre application ASP.NET Core.
Args
IDesignTimeDbContextFactory<TContext>.CreateDbContext et Program.CreateHostBuilder
acceptent les arguments de la ligne de commande.
Ces arguments peuvent être spécifiés à partir des outils :
dotnet ef database update -- --environment Production
Le jeton --
dirige dotnet ef
pour traiter tout ce qui suit comme argument, sans essayer de les analyser en tant qu’options. Tous les arguments supplémentaires, non utilisés par dotnet ef
, sont transférés à l’application.