79 votes

ASP - Core Migrer la base de données SQL EF Core au démarrage

Est-il possible de faire en sorte que mon API Web ASP Core s'assure que la base de données est migrée vers la dernière migration en utilisant EF Core ? Je sais que cela peut être fait par la ligne de commande, mais je veux le faire de manière programmatique.

0 votes

Ce n'est pas encore fait, cela devrait être implémenté dans la prochaine version. Vous pouvez utiliser la solution de contournement de Khan qui est postée ci-dessous.

1 votes

Voir les réponses ci-dessous. Vous devez utiliser soit EnsureCreated, soit Migrate. Pas les deux.

13 votes

La documentation officielle dit : "N'appelez pas EnsureCreated() avant Migrate(). EnsureCreated() court-circuite les migrations pour créer le schéma et fait échouer Migrate()' : docs.microsoft.com/fr/us/ef/core/managing-schemas/migrations/

54voto

Sharknado Points 68

Une note de la documentation sur l'appel à db.Database.EnsureCreated() :

Notez que cette API n'utilise pas les migrations pour créer la base de données. En En outre, la base de données créée ne peut pas être mise à jour ultérieurement à l'aide de migrations. Si vous ciblez une base de données relationnelle et utilisez des et que vous utilisez des migrations, vous pouvez utiliser la méthode DbContext.Database.Migrate() afin de s'assurer que la base de données est créée et que toutes les migrations sont appliquées.

Vous pouvez simplement appeler db.Database.Migrate() .

Commentaire tiré de la source trouvée dans la déclaration ci-dessus aquí .

48voto

Janshair Khan Points 1124

Vous pouvez utiliser

db.Database.EnsureCreated();

pour mettre votre db à jour avec votre modèle actuel. Si vous souhaitez activer les migrations (si des migrations ultérieures sont suspectées), utilisez alors

db.Database.Migrate();

et mettez vos migrations ultérieures dans le temps.

2 votes

EnsureCreated() fonctionne bien mais "context.Database.Migrate() " il n'y a pas de méthode Migrate() pourquoi ? EF Core

8 votes

@Floxy je pense que tu as oublié using Microsoft.EntityFrameworkCore; .

0 votes

@Michael Oui !! j'ai oublié de le mentionner Merci quand même ! !! <3

25voto

chintan310 Points 90

Utilisez le code ci-dessous pour exécuter la migration à

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

3 votes

Après la mise à niveau de .NET Core 2.1 à 3.0 (et implicitement de l'hébergement hors processus à l'hébergement dans le processus), l'appel à Migrate du démarrage a cessé de fonctionner pour moi. L'application web ne démarrait pas sans message d'erreur. J'avais marqué le projet comme <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel‌​> et ça a marché à nouveau.

14voto

pisker Points 218

Sur la base de la réponse de @steamrolla, je propose l'amélioration suivante :

public static class EnsureMigration
{
    public static void EnsureMigrationOfContext<T>(this IApplicationBuilder app) where T:DbContext
    {
        var context = app.ApplicationServices.GetService<T>();
        context.Database.Migrate();
    }
}

Cela vous permet également d'assurer la migration de différents contextes, par exemple si vous disposez d'une base de données d'identité.

Utilisation :

app.EnsureMigrationOfContext<context>();

4voto

Esen Points 627

Sur la base de la réponse de chintan310, voici comment je migre la base de données. Cela permet de séparer les tâches liées à la base de données en Program.cs :

    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetService<AppDbContext>();
                context.Database.Migrate();

                var seeder = scope.ServiceProvider.GetService<AppSeeder>();
                seeder.Seed().Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }

        host.Run();
    }

    private static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

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