Comment et où appeler la base de données.EnsureCreated et de la Base de données.Migrer?

j'ai un ASP.NET MVC 6 application, et je dois appeler la base de données.EnsureCreated et de la Base de données.Migrer méthodes.

Mais où dois-je les appeler?

33
demandé sur Bassam Alugili 2016-07-07 08:24:53

4 réponses

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 une nouvelle méthode de base de L'EF qui garantit l'existence de 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 tous ses schémas sont créés et elle assure également qu'elle est compatible avec le modèle pour ce contexte.

Note: Cette méthode n'utilise pas les migrations pour créer la base de données. En outre, la base de données qui est créée ne peut pas être mise à jour plus tard en utilisant migrations. Si vous ciblez une base de données relationnelle et que vous utilisez des migrations, vous pouvez utiliser la méthode DbContext.Database.Migrate() pour vous assurer que la base de données est créée et que toutes les migrations sont appliquées.

Comment avons-nous fait avec EF 6?

context.Database.EnsureCreated() liste des approches de L'EF 6:

  1. Gestionnaire De Paquets De La Console:

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

  2. du code:

    de la Base de données.SetInitializer CreateDatabaseIfNotExists

ou

avec DbMigrationsConfiguration et set AutomaticMigrationsEnabled = true;

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

applique toute migration en cours pour 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 fait avec EF 6?

context.Database.Migrate() est l'équivalent des approches énumérées ci-dessous: EF 6:

  1. Gestionnaire De Paquets 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 migrations il y a context.Database.Migrate() . Si vous ne voulez pas de migrations et que vous voulez simplement une base de données rapide (généralement pour tester) alors utilisez le contexte.La base de données.EnsureCreated () / EnsureDeleted ().

37
répondu Bassam Alugili 2018-06-14 07:28:51

comme un avant vous devriez lire ce de Rowan Miller:

... EnsureCreated contourne totalement les migrations et crée schéma pour vous, vous ne pouvez pas mélanger cela avec les migrations. EnsureCreated est conçu pour le test ou le prototypage rapide lorsque vous êtes d'accord avec laisser tomber et recréer la base de données à chaque fois. Si vous utilisez migrations et veulent qu'elles soient appliquées automatiquement au démarrage de l'application, puis vous pouvez utiliser context.Database.Migrate() à la place.

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

fonction de démarrage dans 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 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();
    }

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

10
répondu James P 2017-05-23 11:47:04

avec les informations fournies par James P et Bassam Alugili, ce que j'ai fini par faire était d'ajouter ces lignes de code au démarrage.cs- > méthode de configuration.

 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;
            }
8
répondu bailando bailando 2016-07-08 09:51:09

en outre, vous pouvez voir une performance frapper si vous appelez cela dans le constructeur de votre contexte... Après avoir déplacé EnsureCreated dans la configuration.cs utility, j'ai remarqué des améliorations considérables à mes temps de réponse.

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

0
répondu visc 2018-04-24 15:30:04