149 votes

Comment et où, à l'appel de la Base de données.EnsureCreated et de la Base de données.Migrer?

J'ai un ASP.NET MVC 6 application, et j'ai besoin d'appeler la Base de données.EnsureCreated et de la Base de données.Migrer méthodes.

Mais où dois-je les appeler?

178voto

Bassam Alugili Points 1958

Je pense que c'est une question importante qui devrait être bien répondu!

Qu'est-ce que la Base de données.EnsureCreated?

context.Database.EnsureCreated() est nouveau EF de base de la méthode qui garantit que la base de données pour le contexte. Si elle existe, aucune action n'est prise. Si elle n'existe pas, alors la base de données et l'ensemble de son schéma est créé et aussi il s'assure qu'elle est compatible avec le modèle de ce contexte.

Note: Cette méthode ne permet pas d'utiliser les migrations pour créer la base de données. En outre, la base de données qui est créé ne peut être mis à jour en utilisant les migrations. Si vous visez une base de données relationnelle et à l'aide de migrations, vous pouvez utiliser l' DbContext.Database.Migrate() méthode pour s'assurer de la base de données est créée et toutes les migrations sont appliquées.

Comment avons-nous le faire avec EF 6?

context.Database.EnsureCreated() est équivalent à la liste figure ci-dessous approches de EF 6:

  1. Le Gestionnaire De Package De La Console:

    Activer-Migrations-EnableAutomaticMigrations. Ajoutez-Migration/Mise À Jour De La Base De Données.

  2. De code:

    La base de données.SetInitializer CreateDatabaseIfNotExists

ou

Avec DbMigrationsConfiguration et définir AutomaticMigrationsEnabled = true;

Qu'est-ce que la Base de données.Migrer?

S'applique en attente des migrations dans le contexte de la base de données. Créer la base de données si elle n'existe pas déjà.

Comment avons-nous le faire avec EF 6?

context.Database.Migrate() est équivalent à la liste figure ci-dessous approches de EF 6:

  1. Le Gestionnaire De Package De La Console:

    Mise À Jour De La Base De Données -TargetMigration

  2. Avec une coutume DbMigrationsConfiguration:

    AutomaticMigrationsEnabled = false; ou avec DbMigrator.

Conclusion:

Si vous utilisez des migrations n'est - context.Database.Migrate(). Si vous ne voulez pas migrations et veulent juste un moyen rapide de base de données (généralement pour les tests) puis utiliser le contexte.La base de données.EnsureCreated()/EnsureDeleted().

50voto

bailando bailando Points 321

Avec les informations que James P et Bassam Alugili fourni, ce que j'ai fait a été d'ajouter ces lignes de code pour le Démarrage.cs->Configurer la méthode.

 try
            {
                using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                    .CreateScope())
                {

                    serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
                        .Database.Migrate();
                }
            }
            catch (Exception e)
            {
                var msg = e.Message;
                var stacktrace = e.StackTrace;
            }

19voto

James P Points 1582

Comme un avant-propos, vous devriez lire cette de Rowan Miller:

... EnsureCreated totalement contourne les migrations et crée la schéma pour vous, vous ne pouvez pas mélanger cela avec les migrations. EnsureCreatedest conçu pour des tests ou de prototypage rapide où vous êtes ok avec le décrochage et la re-création de la base de données à chaque fois. Si vous utilisez les migrations et l'a appliquée automatiquement sur l'app démarrer, ensuite, vous pouvez utiliser context.Database.Migrate() à la place.

Selon la réponse ici, vous devez ajouter Globals.EnsureDatabaseCreated(); à Startup.cs:

Fonction de démarrage en Démarrage.cs:

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
    Globals.Configuration = Configuration;
    Globals.HostingEnvironment = env;
    Globals.EnsureDatabaseCreated();
}

Et de définir Globals.EnsureDatabaseCreated() comme suit:

public static void EnsureDatabaseCreated()
    {
        var optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
        var context = new ApplicationContext(optionsBuilder.Options);
        context.Database.EnsureCreated();

        optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
        new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
    }

Pour utiliser context.Database.Migrate() voir ici ou ici.

1voto

visc Points 995

En outre, vous pouvez voir une performance succès, si vous appelez cela dans le constructeur de votre contexte... Après le déménagement EnsureCreated à la configuration.cs utilitaire, j'ai remarqué des améliorations considérables pour mon temps de réponse.

Note: j'utilise de l'EFC et de l'UWP.

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