Automatisches Code First-MigrationenAutomatic Code First Migrations

Automatische Migrationen ermöglichen es Ihnen, Code First-Migrationen zu verwenden, ohne dass eine Codedatei in Ihrem Projekt für jede von Ihnen vornimmt.Automatic Migrations allows you to use Code First Migrations without having a code file in your project for each change you make. Nicht alle Änderungen können automatisch angewendet werden, z. b. für Spalten Umbenennungen ist die Verwendung einer Code basierten Migration erforderlich.Not all changes can be applied automatically - for example column renames require the use of a code-based migration.

Hinweis

In diesem Artikel wird davon ausgegangen, dass Sie wissen, wie Code First-Migrationen in einfachen Szenarien verwendet wird.This article assumes you know how to use Code First Migrations in basic scenarios. Andernfalls müssen Sie Code First-Migrationen lesen, bevor Sie fortfahren.If you don’t, then you’ll need to read Code First Migrations before continuing.

Empfehlung für Team UmgebungenRecommendation for Team Environments

Sie können automatische und Code basierte Migrationen interagieren, dies wird jedoch in Team Entwicklungsszenarien nicht empfohlen.You can intersperse automatic and code-based migrations but this is not recommended in team development scenarios. Wenn Sie Teil eines Teams von Entwicklern sind, das die Quell Code Verwaltung verwendet, sollten Sie entweder reine automatische Migrationen oder rein Code basierte Migrationen verwenden.If you are part of a team of developers that use source control you should either use purely automatic migrations or purely code-based migrations. Aufgrund der Einschränkungen für automatische Migrationen empfiehlt sich die Verwendung von Code basierten Migrationen in Team Umgebungen.Given the limitations of automatic migrations we recommend using code-based migrations in team environments.

Erstellen eines Ausgangsmodells und einer AusgangsdatenbankBuilding an Initial Model & Database

Bevor Sie Migrationen verwenden können, benötigen Sie ein Projekt und ein Code First-Modell.Before we start using migrations we need a project and a Code First model to work with. In dieser exemplarischen Vorgehensweise werden die kanonischen Modelle Blog und Post verwendet.For this walkthrough we are going to use the canonical Blog and Post model.

  • Erstellen einer neuen migrationsautomaticdemo -KonsolenanwendungCreate a new MigrationsAutomaticDemo Console application
  • Fügen Sie dem Projekt die neueste Version des NuGet-Pakets EntityFramework hinzu.Add the latest version of the EntityFramework NuGet package to the project
    • Wählen Sie Tools > Bibliotheks-Paket-Manger > Paket-Manager-Konsole aus.Tools –> Library Package Manager –> Package Manager Console
    • Führen Sie den Befehl Install-Package EntityFramework aus.Run the Install-Package EntityFramework command
  • Fügen Sie eine Model.cs-Datei mit dem unten aufgeführten Code hinzu.Add a Model.cs file with the code shown below. Mit diesem Code wird eine einzelne Blog-Klasse, die das Domänenmodell bildet, und eine BlogContext-Klasse, die den EF Code First-Kontext darstellt, definiert.This code defines a single Blog class that makes up our domain model and a BlogContext class that is our EF Code First context
    using System.Data.Entity;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity.Infrastructure;

    namespace MigrationsAutomaticDemo
    {
        public class BlogContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Name { get; set; }
        }
    }
  • Mit dem Modell können Sie nun auf die Daten zugreifen.Now that we have a model it’s time to use it to perform data access. Aktualisieren Sie die Program.cs-Datei mit dem folgenden Code:Update the Program.cs file with the code shown below.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MigrationsAutomaticDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new BlogContext())
                {
                    db.Blogs.Add(new Blog { Name = "Another Blog " });
                    db.SaveChanges();

                    foreach (var blog in db.Blogs)
                    {
                        Console.WriteLine(blog.Name);
                    }
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
  • Führen Sie die Anwendung aus, und Sie werden feststellen, dass eine migrationsautomaticcodedemo. blogcontext -Datenbank für Sie erstellt wird.Run your application and you will see that a MigrationsAutomaticCodeDemo.BlogContext database is created for you.

    Localdb-Datenbank

Aktivieren von MigrationenEnabling Migrations

Im Folgenden erfahren Sie, wie Sie weitere Änderungen am Modell vornehmen.It’s time to make some more changes to our model.

  • Fügen Sie der Blog-Klasse eine URL-Eigenschaft hinzu.Let’s introduce a Url property to the Blog class.
    public string Url { get; set; }

Wenn Sie zu diesem Zeitpunkt die Anwendung erneut ausführen würden, würden Sie die Ausnahme „InvalidOperationException“ mit folgendem Text erhalten: The model backing the 'BlogContext' context has changed since the database was created. Consider using Code First Migrations to update the database ( http://go.microsoft.com/fwlink/?LinkId=238269 ) (Das Modell, das den Kontext „BlogContext“ unterstützt, wurde seit der Erstellung der Datenbank verändert. Verwenden Sie Code First-Migrationen, um die Datenbank zu aktualisieren.).If you were to run the application again you would get an InvalidOperationException stating The model backing the 'BlogContext' context has changed since the database was created. Consider using Code First Migrations to update the database ( http://go.microsoft.com/fwlink/?LinkId=238269).

Beginnen Sie daher mit der Verwendung von Code First-Migrationen.As the exception suggests, it’s time to start using Code First Migrations. Da wir automatische Migrationen verwenden möchten, geben wir den Schalter – enableautomaticmigrationen an.Because we want to use automatic migrations we’re going to specify the –EnableAutomaticMigrations switch.

  • Führen Sie den Befehl enable-Migrationen – enableautomaticmigrationen in der Paket-Manager-Konsole aus. dieser Befehl hat dem Projekt einen Migrations Ordner hinzugefügt.Run the Enable-Migrations –EnableAutomaticMigrations command in Package Manager Console This command has added a Migrations folder to our project. Dieser neue Ordner enthält eine Datei:This new folder contains one file:

  • Die Dateikonfigurationsklasse:The Configuration class. Mit dieser Klasse können Sie das Verhalten von Migrationen für den Kontext konfigurieren.This class allows you to configure how Migrations behaves for your context. Verwenden Sie für diese exemplarische Vorgehensweise die Standardkonfiguration.For this walkthrough we will just use the default configuration. Da in Ihrem Projekt nur ein einzelner Code First-Kontext vorhanden ist, wurde der Kontexttyp, der für diese Konfiguration gilt, automatisch von „Enable-Migrations“ ausgefüllt.Because there is just a single Code First context in your project, Enable-Migrations has automatically filled in the context type this configuration applies to.

 

Ihre erste automatische MigrationYour First Automatic Migration

Code First-Migrationen verfügt über zwei primäre Befehle, die Sie im Folgenden kennenlernen werden:Code First Migrations has two primary commands that you are going to become familiar with.

  • Add-Migration erstellt den Entwurf für die nächste Migration basierend auf Änderungen, die Sie seit dem Erstellen der letzten Migration an Ihrem Modell vorgenommen haben.Add-Migration will scaffold the next migration based on changes you have made to your model since the last migration was created
  • Update-Database übernimmt alle ausstehenden Migrationen für die Datenbank.Update-Database will apply any pending migrations to the database

Wir werden die Verwendung von Add-Migration vermeiden (es sei denn, wir brauchen dies wirklich) und konzentrieren uns darauf, dass Code First-Migrationen die Änderungen automatisch berechnen und anwenden können.We are going to avoid using Add-Migration (unless we really need to) and focus on letting Code First Migrations automatically calculate and apply the changes. Verwenden Sie " Update-Database ", um Code First-Migrationen, die Änderungen an unser Modell (die neue Eigenschaft " Blog. url") an die Datenbank zu überführen.Let’s use Update-Database to get Code First Migrations to push the changes to our model (the new Blog.Url property) to the database.

  • Führen Sie den Befehl Update-Database in der Paket-Manager-Konsole aus.Run the Update-Database command in Package Manager Console.

Die migrationsautomaticdemo. blogcontext -Datenbank wurde nun aktualisiert und enthält nun die URL -Spalte in der Blogs -Tabelle.The MigrationsAutomaticDemo.BlogContext database is now updated to include the Url column in the Blogs table.

 

Ihre zweite automatische MigrationYour Second Automatic Migration

Nehmen wir eine weitere Änderung vor, und lassen Sie Code First-Migrationen die Änderungen für uns automatisch per Push an die Datenbank überführen.Let’s make another change and let Code First Migrations automatically push the changes to the database for us.

  • Fügen Sie zudem eine neue Post-Klasse hinzu.Let's also add a new Post class
    public class Post
    {
        public int PostId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
  • Fügen Sie anschließend der Blog-Klasse eine Posts-Sammlung hinzu, die das andere Ende der Beziehung zwischen Blog und Post bilden soll.We'll also add a Posts collection to the Blog class to form the other end of the relationship between Blog and Post
    public virtual List<Post> Posts { get; set; }

Verwenden Sie jetzt Update-Database , um die Datenbank auf den neuesten Stand zu bringen.Now use Update-Database to bring the database up-to-date. Geben Sie dieses Mal das Flag –Verbose an, damit das SQL angezeigt wird, mit dem Code First-Migrationen ausgeführt wird.This time let’s specify the –Verbose flag so that you can see the SQL that Code First Migrations is running.

  • Führen Sie in der Paket-Manager-Konsole den Befehl Update-Database –Verbose aus.Run the Update-Database –Verbose command in Package Manager Console.

Hinzufügen einer Code basierten MigrationAdding a Code Based Migration

Sehen wir uns nun an, wie wir eine Code basierte Migration für verwenden möchten.Now let’s look at something we might want to use a code-based migration for.

  • Fügen Sie der Blog -Klasse eine Bewertungs Eigenschaft hinzu.Let’s add a Rating property to the Blog class
    public int Rating { get; set; }

Wir könnten einfach " Update-Database " ausführen, um diese Änderungen per Push in die Datenbank zu überführen.We could just run Update-Database to push these changes to the database. Allerdings fügen wir eine Blogs. Rating -Spalte hinzu, die keine NULL-Werte zulässt. Wenn in der Tabelle vorhandene Daten vorhanden sind, wird ihr die CLR-Standardeinstellung des Datentyps für die neue Spalte zugewiesen (die Bewertung ist Integer, d. h. 0).However, we're adding a non-nullable Blogs.Rating column, if there is any existing data in the table it will get assigned the CLR default of the data type for new column (Rating is integer, so that would be 0). Damit die vorhandenen Spalten der Blogs-Tabelle mit einem vernünftigen Rating-Wert beginnen, geben Sie den Standardwert 3 an.But we want to specify a default value of 3 so that existing rows in the Blogs table will start with a decent rating. Verwenden Sie den Add-Migration-Befehl, um diese Änderung in eine Code basierte Migration zu schreiben, damit wir Sie bearbeiten können.Let’s use the Add-Migration command to write this change out to a code-based migration so that we can edit it. Der Befehl " Add-Migration " ermöglicht es uns, diesen Migrationen einen Namen zu geben. wir nennen einfach "unsere addblograting".The Add-Migration command allows us to give these migrations a name, let’s just call ours AddBlogRating.

  • Führen Sie den Befehl Add-Migration addblograting in der Paket-Manager-Konsole aus.Run the Add-Migration AddBlogRating command in Package Manager Console.
  • Im Migrations Ordner verfügen wir nun über eine neue Migration von addblograting .In the Migrations folder we now have a new AddBlogRating migration. Der Dateiname der Migration ist mit einem Zeitstempel versehen, um die Reihenfolge zu unterstützen.The migration filename is pre-fixed with a timestamp to help with ordering. Wir bearbeiten den generierten Code, um den Standardwert 3 für Blog. Rating (Zeile 10 im folgenden Code) anzugeben.Let’s edit the generated code to specify a default value of 3 for Blog.Rating (Line 10 in the code below)

Die Migration umfasst auch eine Code Behind-Datei, in der einige Metadaten erfasst werden. Diese Metadaten ermöglichen es Code First-Migrationen, die automatischen Migrationen zu replizieren, die wir vor dieser Code basierten Migration durchgeführt haben. Dies ist wichtig, wenn ein anderer Entwickler unsere Migrationen ausführen möchte oder wenn es an der Zeit ist, die Anwendung bereitzustellen.The migration also has a code-behind file that captures some metadata. This metadata will allow Code First Migrations to replicate the automatic migrations we performed before this code-based migration. This is important if another developer wants to run our migrations or when it’s time to deploy our application.

    namespace MigrationsAutomaticDemo.Migrations
    {
        using System;
        using System.Data.Entity.Migrations;

        public partial class AddBlogRating : DbMigration
        {
            public override void Up()
            {
                AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
            }

            public override void Down()
            {
                DropColumn("Blogs", "Rating");
            }
        }
    }

Die Migration ist nun fertig bearbeitet. Aktualisieren Sie daher die Datenbank mit Update-Database.Our edited migration is looking good, so let’s use Update-Database to bring the database up-to-date.

  • Führen Sie den Befehl Update-Database in der Paket-Manager-Konsole aus.Run the Update-Database command in Package Manager Console.

Zurück zu automatischen MigrationenBack to Automatic Migrations

Wir können nun für unsere einfacheren Änderungen wieder zu automatischen Migrationen wechseln.We are now free to switch back to automatic migrations for our simpler changes. Code First-Migrationen übernimmt die automatische und Code basierte Migration in der richtigen Reihenfolge basierend auf den Metadaten, die Sie in der Code-Behind-Datei für jede Code basierte Migration speichert.Code First Migrations will take care of performing the automatic and code-based migrations in the correct order based on the metadata it is storing in the code-behind file for each code-based migration.

  • Fügen wir dem Modell eine Post. Abstract-Eigenschaft hinzu.Let’s add a Post.Abstract property to our model
    public string Abstract { get; set; }

Nun können wir mit Update-Database Code First-Migrationen, diese Änderung mithilfe einer automatischen Migration an die Datenbank zu übernehmen.Now we can use Update-Database to get Code First Migrations to push this change to the database using an automatic migration.

  • Führen Sie den Befehl Update-Database in der Paket-Manager-Konsole aus.Run the Update-Database command in Package Manager Console.

ZusammenfassungSummary

In dieser exemplarischen Vorgehensweise wurde erläutert, wie automatische Migrationen verwendet werden, um Modelländerungen per Push an die Datenbank zu überführenIn this walkthrough you saw how to use automatic migrations to push model changes to the database. Sie haben auch gesehen, wie Sie Code basierte Migrationen zwischen automatischen Migrationen aufbauen und ausführen können, wenn Sie mehr Kontrolle benötigen.You also saw how to scaffold and run code-based migrations in between automatic migrations when you need more control.