wake-up-neo.net

Wie und wo kann ich Database.EnsureCreated und Database.Migrate aufrufen?

Ich habe eine ASP.NET MVC 6-Anwendung, und ich muss die Database.EnsureCreated- und Database.Migrate-Methoden aufrufen.

Aber wo soll ich sie anrufen?

40

Ich denke, das ist eine wichtige Frage und sollte gut beantwortet werden!

Was ist Database.EnsureCreated?

context.Database.EnsureCreated() ist eine neue EF-Kernmethode, die sicherstellt, dass die Datenbank für den Kontext vorhanden ist. Wenn es existiert, wird keine Aktion ausgeführt. Wenn es nicht existiert, werden die Datenbank und ihr gesamtes Schema erstellt und es wird sichergestellt, dass es mit dem Modell für diesen Kontext kompatibel ist.

Note: Diese Methode verwendet keine Migrationen zum Erstellen der Datenbank. Darüber hinaus kann die erstellte Datenbank später nicht mithilfe von Migrationen aktualisiert werden. Wenn Sie auf eine relationale Datenbank abzielen und Migrationen verwenden, können Sie mit der Methode DbContext.Database.Migrate() sicherstellen, dass die Datenbank erstellt wird und alle Migrationen angewendet werden.

Wie haben wir das mit EF 6 gemacht?

context.Database.EnsureCreated() entspricht den unten aufgeführten Ansätzen von EF 6:

  1. Package Manager Console: 

    Enable-Migrations -EnableAutomaticMigrations. Add-Migration/Update-Datenbank.

  2. Vom Code:

    Database.SetInitializer CreateDatabaseIfNotExists

oder

Mit DbMigrationsConfiguration und set AutomaticMigrationsEnabled = true;

Was ist Database.Migrate?

Wendet alle ausstehenden Migrationen für den Kontext auf die Datenbank an. Erstellt die Datenbank, falls noch nicht vorhanden.

Wie haben wir das mit EF 6 gemacht?

context.Database.Migrate() entspricht den unten aufgeführten Ansätzen von EF 6:

  1. Package Manager Console:

    Update-Datenbank -TargetMigration 

  2. Mit einer benutzerdefinierten DbMigrationsConfiguration: 

    AutomaticMigrationsEnabled = false; oder mit DbMigrator.

Fazit :

Wenn Sie Migrationen verwenden, gibt es context.Database.Migrate(). Wenn Sie keine Migrationen wünschen und nur eine schnelle Datenbank möchten (normalerweise zum Testen), verwenden Sie context.Database.EnsureCreated ()/EnsureDeleted ().

50
Bassam Alugili

Als Vorwort sollten Sie this von Rowan Miller lesen:

... EnsureCreated umgeht Migrationen vollständig und erstellt einfach die Schema für Sie, Sie können dies nicht mit Migrationen mischen. EnsureCreated ist Entworfen für Tests oder Rapid Prototyping, wenn Sie mit .__ zufrieden sind. Die Datenbank wird jedes Mal gelöscht und neu erstellt. Wenn Sie .__ verwenden. Migrationen und möchten, dass sie beim Start der App automatisch angewendet werden, dann können Sie stattdessen context.Database.Migrate() verwenden.

Laut Antwort hier müssen Sie Globals.EnsureDatabaseCreated(); es zu Startup.cs hinzufügen:

Startup-Funktion in Startup.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();
}

Und definiere Globals.EnsureDatabaseCreated() wie folgt:

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();
    }

Um context.Database.Migrate() zu verwenden, siehe hier oder hier .

10
James P

Mit den Informationen, die James P und Bassam Alugili zur Verfügung gestellt haben, habe ich letztendlich diese Codezeilen der Methode Startup.cs-> Configure hinzugefügt.

 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;
            }
10

Außerdem wird möglicherweise ein Leistungstreffer angezeigt, wenn Sie dies im Konstruktor Ihres Kontexts aufrufen. Nachdem Sie EnsureCreated in das Dienstprogramm setup.cs verschoben haben, sind erhebliche Verbesserungen bei meinen Antwortzeiten festzustellen. 

Hinweis: Ich verwende EFC und UWP.

0
visc