Code First-Migrationen mit einer vorhandenen DatenbankCode First Migrations with an existing database

Hinweis

EF 4.3 und höher: die Features, APIs usw., die auf dieser Seite erläutert wurden, wurden in Entity Framework 4,1 eingeführt.EF4.3 Onwards Only - The features, APIs, etc. discussed in this page were introduced in Entity Framework 4.1. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.If you are using an earlier version, some or all of the information does not apply.

In diesem Artikel wird die Verwendung von Code First-Migrationen mit einer vorhandenen Datenbank behandelt, die nicht von Entity Framework erstellt wurde.This article covers using Code First Migrations with an existing database, one that wasn’t created by Entity Framework.

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.

ScreencastsScreencasts

Wenn Sie lieber einen Screencast sehen möchten, als diesen Artikel zu lesen, befassen sich die beiden folgenden Videos mit dem gleichen Inhalt wie dieser Artikel.If you'd rather watch a screencast than read this article, the following two videos cover the same content as this article.

Video 1: "Migrationen" im HintergrundVideo One: "Migrations - Under the Hood"

Dieser Screencast erläutert, wie Migrationen Informationen über das Modell nachverfolgt und verwendet, um Modelländerungen zu erkennen.This screencast covers how migrations tracks and uses information about the model to detect model changes.

Video 2: "Migrationen-vorhandene Datenbanken"Video Two: "Migrations - Existing Databases"

Wenn Sie auf die Konzepte aus dem vorherigen Video aufbauen, wird in diesem Screencast erläutert, wie Migrationen mit einer vorhandenen Datenbank aktiviert und verwendet werden.Building on the concepts from the previous video, this screencast covers how to enable and use migrations with an existing database.

Schritt 1: Erstellen eines ModellsStep 1: Create a model

Der erste Schritt besteht darin, ein Code First Modell zu erstellen, das Ihre vorhandene Datenbank als Ziel verwendet.Your first step will be to create a Code First model that targets your existing database. Im Thema Code First zu einer vorhandenen Datenbank finden Sie eine ausführliche Anleitung zur Vorgehensweise.The Code First to an Existing Database topic provides detailed guidance on how to do this.

Hinweis

Es ist wichtig, die restlichen Schritte in diesem Thema auszuführen, bevor Sie Änderungen am Modell vornehmen, die Änderungen am Datenbankschema erfordern.It is important to follow the rest of the steps in this topic before making any changes to your model that would require changes to the database schema. Die folgenden Schritte erfordern, dass das Modell mit dem Datenbankschema synchron ist.The following steps require the model to be in-sync with the database schema.

Schritt 2: Aktivieren von MigrationenStep 2: Enable Migrations

Der nächste Schritt besteht darin, Migrationen zu aktivieren.The next step is to enable migrations. Hierzu können Sie den Befehl enable-Migrationen in der Paket-Manager-Konsole ausführen.You can do this by running the Enable-Migrations command in Package Manager Console.

Mit diesem Befehl wird ein Ordner in der Projekt Mappe mit dem Namen Migrationen erstellt und eine einzelne Klasse als Konfiguration bezeichnet.This command will create a folder in your solution called Migrations, and put a single class inside it called Configuration. Die Konfigurations Klasse ist der Ort, an dem Sie Migrationen für Ihre Anwendung konfigurieren. Weitere Informationen dazu finden Sie im Code First-Migrationen Thema.The Configuration class is where you configure migrations for your application, you can find out more about it in the Code First Migrations topic.

Schritt 3: Hinzufügen einer ersten MigrationStep 3: Add an initial migration

Nachdem Migrationen erstellt und auf die lokale Datenbank angewendet wurden, können Sie diese Änderungen auch auf andere Datenbanken anwenden.Once migrations have been created and applied to the local database you may also want to apply these changes to other databases. Beispielsweise kann die lokale Datenbank eine Testdatenbank sein, und Sie können die Änderungen letztendlich auch auf eine Produktionsdatenbank und/oder andere Entwickler Testdatenbanken anwenden.For example, your local database may be a test database and you may ultimately want to also apply the changes to a production database and/or other developers test databases. Es gibt zwei Optionen für diesen Schritt, und Sie sollten auswählen, ob das Schema anderer Datenbanken leer ist oder derzeit mit dem Schema der lokalen Datenbank übereinstimmt.There are two options for this step and the one you should pick depends whether or not the schema of any other databases is empty or currently matches the schema of the local database.

  • Option 1: vorhandenes Schema als Ausgangspunkt verwenden.Option One: Use existing schema as starting point. Sie sollten diesen Ansatz verwenden, wenn in Zukunft andere Datenbanken, auf die Migrationen angewendet werden, das gleiche Schema wie Ihre lokale Datenbank haben.You should use this approach when other databases that migrations will be applied to in the future will have the same schema as your local database currently has. Beispielsweise können Sie diese verwenden, wenn die lokale Testdatenbank derzeit V1 der Produktionsdatenbank entspricht und Sie diese Migrationen später anwenden, um die Produktionsdatenbank auf v2 zu aktualisieren.For example, you might use this if your local test database currently matches v1 of your production database and you will later apply these migrations to update your production database to v2.
  • Option 2: Verwenden Sie eine leere Datenbank als Ausgangspunkt.Option Two: Use empty database as starting point. Sie sollten diesen Ansatz verwenden, wenn andere Datenbanken, auf die in Zukunft migriert wird, leer sind (oder noch nicht vorhanden sind).You should use this approach when other databases that migrations will be applied to in the future are empty (or do not exist yet). Beispielsweise können Sie diese verwenden, wenn Sie mit der Entwicklung ihrer Anwendung mit einer Testdatenbank, aber ohne Migrationen begonnen haben und später eine Produktionsdatenbank von Grund auf neu erstellen möchten.For example, you might use this if you started developing your application using a test database but without using migrations and you will later want to create a production database from scratch.

Option 1: vorhandenes Schema als Ausgangspunkt verwendenOption One: Use existing schema as a starting point

Code First-Migrationen verwendet eine Momentaufnahme des Modells, das in der letzten Migration gespeichert ist, um Änderungen am Modell zu erkennen (Ausführliche Informationen hierzu finden Sie in Code First-Migrationen in Team Umgebungen).Code First Migrations uses a snapshot of the model stored in the most recent migration to detect changes to the model (you can find detailed information about this in Code First Migrations in Team Environments). Da wir davon ausgehen, dass die Datenbanken bereits über das Schema des aktuellen Modells verfügen, generieren wir eine leere Migration (No-OP), die das aktuelle Modell als Momentaufnahme hat.Since we are going to assume that databases already have the schema of the current model, we will generate an empty (no-op) migration that has the current model as a snapshot.

  1. Führen Sie den Befehl Add-Migration InitialCreate – ignorechanges in der Paket-Manager-Konsole aus.Run the Add-Migration InitialCreate –IgnoreChanges command in Package Manager Console. Dadurch wird eine leere Migration mit dem aktuellen Modell als Momentaufnahme erstellt.This creates an empty migration with the current model as a snapshot.
  2. Führen Sie den Befehl Update-Database in der Paket-Manager-Konsole aus.Run the Update-Database command in Package Manager Console. Dadurch wird die InitialCreate-Migration auf die Datenbank angewendet.This will apply the InitialCreate migration to the database. Da die tatsächliche Migration keine Änderungen enthält, wird der migrationshistory-Tabelle einfach eine Zeile hinzugefügt, die _ _ anzeigt, dass diese Migration bereits angewendet wurde.Since the actual migration doesn’t contain any changes, it will simply add a row to the __MigrationsHistory table indicating that this migration has already been applied.

Option 2: leere Datenbank als Ausgangspunkt verwendenOption Two: Use empty database as a starting point

In diesem Szenario sind Migrationen erforderlich, um die gesamte Datenbank von Grund auf neu erstellen zu können – einschließlich der Tabellen, die bereits in der lokalen Datenbank vorhanden sind.In this scenario we need Migrations to be able to create the entire database from scratch – including the tables that are already present in our local database. Wir generieren eine InitialCreate-Migration, die Logik zum Erstellen des vorhandenen Schemas enthält.We’re going to generate an InitialCreate migration that includes logic to create the existing schema. Anschließend wird die vorhandene Datenbank so aussehen, wie diese Migration bereits angewendet wurde.We’ll then make our existing database look like this migration has already been applied.

  1. Führen Sie den Befehl Add-Migration InitialCreate in der Paket-Manager-Konsole aus.Run the Add-Migration InitialCreate command in Package Manager Console. Dadurch wird eine Migration erstellt, um das vorhandene Schema zu erstellen.This creates a migration to create the existing schema.
  2. Kommentieren Sie den gesamten Code in der up-Methode der neu erstellten Migration aus.Comment out all code in the Up method of the newly created migration. Auf diese Weise können wir die Migration auf die lokale Datenbank anwenden, ohne zu versuchen, alle Tabellen neu zu erstellen usw., die bereits vorhanden sind.This will allow us to ‘apply’ the migration to the local database without trying to recreate all the tables etc. that already exist.
  3. Führen Sie den Befehl Update-Database in der Paket-Manager-Konsole aus.Run the Update-Database command in Package Manager Console. Dadurch wird die InitialCreate-Migration auf die Datenbank angewendet.This will apply the InitialCreate migration to the database. Da die tatsächliche Migration keine Änderungen enthält (da wir Sie vorübergehend auskommentiert haben), wird der migrationshistory-Tabelle einfach eine Zeile hinzugefügt, die _ _ anzeigt, dass diese Migration bereits angewendet wurde.Since the actual migration doesn’t contain any changes (because we temporarily commented them out), it will simply add a row to the __MigrationsHistory table indicating that this migration has already been applied.
  4. Kommentieren Sie den Code in der up-Methode aus.Un-comment the code in the Up method. Dies bedeutet, dass beim Anwenden dieser Migration auf zukünftige Datenbanken das Schema, das bereits in der lokalen Datenbank vorhanden war, durch Migrationen erstellt wird.This means that when this migration is applied to future databases, the schema that already existed in the local database will be created by migrations.

Worauf Sie achten solltenThings to be aware of

Es gibt einige Dinge, die Sie beachten müssen, wenn Sie Migrationen für eine vorhandene Datenbank verwenden.There are a few things you need to be aware of when using Migrations against an existing database.

Standard-/berechnete Namen dürfen nicht mit vorhandenem Schema identisch seinDefault/calculated names may not match existing schema

Migrationen geben explizit Namen für Spalten und Tabellen an, wenn ein Gerüst für Migrationen festgelegt wird.Migrations explicitly specifies names for columns and tables when it scaffolds a migrations. Es gibt jedoch andere Datenbankobjekte, für die Migrationen beim Anwenden der Migrationen einen Standardnamen für berechnen.However, there are other database objects that Migrations calculates a default name for when applying the migrations. Dies schließt Indizes und FOREIGN KEY-Einschränkungen ein.This includes indexes and foreign key constraints. Wenn Sie ein vorhandenes Schema als Ziel haben, Stimmen diese berechneten Namen möglicherweise nicht mit den in der Datenbank vorhandenen Daten identisch.When targeting an existing schema, these calculated names may not match what actually exists in your database.

Im folgenden finden Sie einige Beispiele für den Fall, dass Sie sich Folgendes bewusst sein müssen:Here are some examples of when you need to be aware of this:

Wenn Sie "Option 1: vorhandenes Schema als Ausgangspunkt verwenden" aus Schritt 3 verwendet haben:If you used ‘Option One: Use existing schema as a starting point’ from Step 3:

  • Wenn zukünftige Änderungen im Modell eine Änderung oder Löschung eines Datenbankobjekts erfordern, das anders benannt ist, müssen Sie die Gerüst Migration ändern, um den richtigen Namen anzugeben.If future changes in your model require changing or dropping one of the database objects that is named differently, you will need to modify the scaffolded migration to specify the correct name. Die Migrations-APIs verfügen über einen optionalen Name-Parameter, mit dem Sie dies tun können.The Migrations APIs have an optional Name parameter that allows you to do this. Beispielsweise kann Ihr vorhandenes Schema über eine Post-Tabelle mit einer BlogId-Fremdschlüssel Spalte verfügen, die einen Index namens indexfk _ BlogId aufweist.For example, your existing schema may have a Post table with a BlogId foreign key column that has an index named IndexFk_BlogId. Standardmäßig erwarten Migrationen jedoch, dass dieser Index "IX BlogId" genannt wird _ .However, by default Migrations would expect this index to be named IX_BlogId. Wenn Sie eine Änderung an Ihrem Modell vornehmen, die dazu führt, dass dieser Index gelöscht wird, müssen Sie den aufgerücherten DropIndex-Befehl ändern, um den indexfk- _ BlogId-Namen anzugeben.If you make a change to your model that results in dropping this index, you will need to modify the scaffolded DropIndex call to specify the IndexFk_BlogId name.

Wenn Sie "Option 2: leere Datenbank als Ausgangspunkt verwenden" aus Schritt 3 verwendet haben:If you used ‘Option Two: Use empty database as a starting point’ from Step 3:

  • Wenn Sie versuchen, die Down-Methode der anfänglichen Migration (d. h. das Zurücksetzen auf eine leere Datenbank) für die lokale Datenbank auszuführen, tritt möglicherweise ein Fehler auf, weil bei der Migration versucht wird, Indizes und Fremdschlüssel Einschränkungen mithilfe falscher Namen zu löschen.Trying to run the Down method of the initial migration (that is, reverting to an empty database) against your local database may fail because Migrations will try to drop indexes and foreign key constraints using the incorrect names. Dies wirkt sich nur auf die lokale Datenbank aus, da andere Datenbanken mithilfe der up-Methode der anfänglichen Migration von Grund auf neu erstellt werden.This will only affect your local database since other databases will be created from scratch using the Up method of the initial migration. Wenn Sie die vorhandene lokale Datenbank auf einen leeren Zustand herabstufen möchten, ist es am einfachsten, dies manuell durchzuführen, indem Sie entweder die Datenbank löschen oder alle Tabellen löschen.If you want to downgrade your existing local database to an empty state it is easiest to do this manually, either by dropping the database or dropping all the tables. Nach dieser anfänglichen Herabstufung werden alle Datenbankobjekte mit den Standardnamen neu erstellt, sodass dieses Problem nicht mehr auftritt.After this initial downgrade all database objects will be recreated with the default names, so this issue will not present itself again.
  • Wenn zukünftige Änderungen im Modell eine Änderung oder Löschung eines Datenbankobjekts erfordern, das anders benannt ist, funktioniert dies nicht für Ihre vorhandene lokale Datenbank – da die Namen nicht den Standardwerten entsprechen.If future changes in your model require changing or dropping one of the database objects that is named differently, this will not work against your existing local database – since the names won’t match the defaults. Allerdings funktioniert es für Datenbanken, die von Grund auf neu erstellt wurden, da Sie die Standardnamen verwendet haben, die von Migrationen ausgewählt werden.However, it will work against databases that were created ‘from scratch’ since they will have used the default names chosen by Migrations. Sie können diese Änderungen entweder manuell für Ihre lokale vorhandene Datenbank vornehmen, oder Sie sollten in Erwägung ziehen, dass Ihre Datenbank von Grund auf neu erstellt wird – wie auf anderen Computern.You could either make these changes manually on your local existing database, or consider having Migrations recreate your database from scratch – as it will on other machines.
  • Datenbanken, die mit der up-Methode der anfänglichen Migration erstellt wurden, können sich geringfügig von der lokalen Datenbank unterscheiden, da die berechneten Standardnamen für Indizes und FOREIGN KEY-Einschränkungen verwendet werden.Databases created using the Up method of your initial migration may differ slightly from the local database since the calculated default names for indexes and foreign key constraints will be used. Möglicherweise verfügen Sie auch über zusätzliche Indizes, da Migrationen standardmäßig Indizes für Fremdschlüssel Spalten erstellen – Dies ist möglicherweise nicht der Fall in der ursprünglichen lokalen Datenbank.You may also end up with extra indexes as Migrations will create indexes on foreign key columns by default – this may not have been the case in your original local database.

Nicht alle Datenbankobjekte werden im Modell dargestellt.Not all database objects are represented in the model

Datenbankobjekte, die nicht Teil des Modells sind, werden nicht von Migrationen behandelt.Database objects that are not part of your model will not be handled by Migrations. Dies kann Sichten, gespeicherte Prozeduren, Berechtigungen, Tabellen enthalten, die nicht Teil des Modells sind, zusätzliche Indizes usw.This can include views, stored procedures, permissions, tables that are not part of your model, additional indexes, etc.

Im folgenden finden Sie einige Beispiele für den Fall, dass Sie sich Folgendes bewusst sein müssen:Here are some examples of when you need to be aware of this:

  • Unabhängig von der Option, die Sie in "Schritt 3" gewählt haben, ist es bei zukünftigen Änderungen im Modell erforderlich, diese zusätzlichen Objekte zu ändern oder zu löschen.Regardless of the option you chose in ‘Step 3’, if future changes in your model require changing or dropping these additional objects Migrations will not know to make these changes. Wenn Sie z. b. eine Spalte mit einem zusätzlichen Index löschen, wissen Migrationen nicht, ob der Index gelöscht werden soll.For example, if you drop a column that has an additional index on it, Migrations will not know to drop the index. Sie müssen diese manuell der Gerüst Migration hinzufügen.You will need to manually add this to the scaffolded Migration.
  • Wenn Sie "Option 2: leere Datenbank als Ausgangspunkt verwenden" verwendet haben, werden diese zusätzlichen Objekte nicht von der up-Methode der anfänglichen Migration erstellt.If you used ‘Option Two: Use empty database as a starting point’, these additional objects will not be created by the Up method of your initial migration. Sie können die nach-oben-und die nach-unten-Methode ändern, um diese zusätzlichen Objekte bei Bedarf zu übernehmen.You can modify the Up and Down methods to take care of these additional objects if you wish. Für Objekte, die in der Migrations-API nicht unterstützt werden – z. b. Ansichten – können Sie die SQL -Methode verwenden, um unformatierten SQL-Daten auszuführen und zu erstellen/zu löschen.For objects that are not natively supported in the Migrations API – such as views – you can use the Sql method to run raw SQL to create/drop them.