136 votes

créer automatiquement une base de données dans Entity Framework Core

Mon application qui est en cours de porté sur .NET de base sera le nouveau EF Base SQLite. Je veux créer automatiquement la base de données et les structures de tables lors de l'application de la première exécution. Selon l'EF documentation de base c'est fait à l'aide des commandes manuelles

dotnet ef migrations add MyFirstMigration

dotnet ef database update

Mais je ne veux pas la fin de l'utilisateur à entrer ces commandes et préférez l'application est de créer et d'installation de la base de données pour la première utilisation. Pour EF 6 il existe des fonctionnalités comme

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

Mais en EF de Base ne semblent pas exister. Je ne trouve pas d'exemples ou de la documentation sur quelque chose d'équivalent pour les EF de base et il n'est pas mentionné dans la liste des fonctionnalités manquantes dans l'EF la documentation de base. J'ai le modèle des classes d'installation déjà donc je pourrais écrire un peu de code pour initialiser la base de données basée sur les modèles, mais il serait tas plus facile si le cadre fait cela automatiquement. Je ne veux pas la génération automatique du modèle ou de la migration, il suffit de créer les structures de la table sur une nouvelle base de données.

Ai-je raté quelque chose ici, ou est la création automatique de la table de fonction manquant en EF?

197voto

Ricardo Fontana Points 2048

Si vous avez créé des migrations, vous pouvez exécuter dans le Démarrage.cs comme suit.

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
      }

      ...

Cela va créer la base de données et les tables à l'aide de votre ajoutés migrations.

Si vous n'êtes pas à l'aide de Entity Framework Migrations, et, au lieu juste besoin de votre DbContext modèle créé exactement comme il est dans votre contexte de la classe à la première exécution, vous pouvez utiliser:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.EnsureCreated();
      }

      ...

Au lieu de cela.

Si vous devez supprimer de votre base de données avant de faire en sorte qu'il est créé, composez le:

            context.Database.EnsureDeleted();

Juste avant l'appel à EnsureCreated()

Adapté de: http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html?highlight=entity

40voto

susieloo_ Points 505

Ma réponse est très similaire à Ricardo de la réponse, mais j'ai l'impression que mon approche est un peu plus simple tout simplement parce qu'il ya tellement de choses dans sa using fonction que je ne suis même pas sûr exactement comment il fonctionne à un niveau inférieur.

Donc, pour ceux qui veulent un moyen simple et propre solution qui crée une base de données pour vous, où vous savez exactement ce qui se passe sous le capot, c'est pour vous:

public Startup(IHostingEnvironment env)
{
    using (var client = new TargetsContext())
    {
        client.Database.EnsureCreated();
    }
}

Ce joli beaucoup signifie que dans l' DbContext que vous avez créé (dans ce cas, le mien s'appelle TargetsContext), vous pouvez utiliser une instance de la DbContext pour s'assurer que les tables définies dans la classe sont créés lors de la phase de Démarrage.cs est exécuté dans votre application.

21voto

John Pankowicz Points 101

Si vous obtenez le contexte via la liste de paramètres de Configure dans Startup.cs, procédez comme suit:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env,  LoggerFactory loggerFactory,
    ApplicationDbContext context)
 {
      context.Database.Migrate();
      ...
 

19voto

geezer498 Points 183

Pour EF Core 2.0+, j'ai dû adopter une approche différente car ils ont modifié l'API. À compter de mars 2019, Microsoft vous recommande de placer le code de migration de votre base de données dans la classe d'entrée de votre application, mais en dehors du code de génération WebHost.

 public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();
        using (var serviceScope = host.Services.CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>();
            context.Database.Migrate();
        }
        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
 

13voto

Nathan Alard Points 387

Si vous n'avez pas créé de migrations, il y a 2 options

1.créez la base de données et les tables à partir de l'application Main:

 var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
 

2.créez les tables si la base de données existe déjà:

 var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();
 

Merci à la réponse de Bubi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X