Code First Migrations in Team Environments (Code First-Migrationen in Teamumgebungen)Code First Migrations in Team Environments

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.

Holen Sie sich einen Kaffee. Sie müssen diesen Artikel lesen.Grab a coffee, you need to read this whole article

Die Probleme in Team Umgebungen sind hauptsächlich das Zusammenführen von Migrationen, wenn zwei Entwickler in Ihrer lokalen Codebasis Migrationen generiert haben.The issues in team environments are mostly around merging migrations when two developers have generated migrations in their local code base. Die Schritte zum Lösen dieser Probleme sind recht einfach, Sie erfordern jedoch ein solides Verständnis der Funktionsweise von Migrationen.While the steps to solve these are pretty simple, they require you to have a solid understanding of how migrations works. Fahren Sie nicht einfach mit dem Ende fort – nehmen Sie sich die Zeit, den gesamten Artikel zu lesen, um sicherzustellen, dass Sie erfolgreich sind.Please don’t just skip ahead to the end – take the time to read the whole article to ensure you are successful.

Allgemeine RichtlinienSome general guidelines

Bevor wir uns mit der Verwaltung von Zusammenführungs Migrationen befassen, die von mehreren Entwicklern generiert werden, finden Sie hier einige allgemeine Richtlinien, die Sie für einen erfolgreichen Einstieg einrichtenBefore we dig into how to manage merging migrations generated by multiple developers, here are some general guidelines to set you up for success.

Jedes Teammitglied sollte über eine lokale Entwicklungs Datenbank verfügen.Each team member should have a local development database

Migrationen verwenden die ** _ _ migrationshistory** -Tabelle, um zu speichern, welche Migrationen auf die Datenbank angewendet wurden.Migrations uses the __MigrationsHistory table to store what migrations have been applied to the database. Wenn Sie über mehrere Entwickler verfügen, die unterschiedliche Migrationen erzeugen, während Sie versuchen, auf dieselbe Datenbank zu Zielen (und somit eine ** _ _ migrationshistory** -Tabelle freigeben), wird die Migration sehr verwirrend.If you have multiple developers generating different migrations while trying to target the same database (and thus share a __MigrationsHistory table) migrations is going to get very confused.

Wenn Sie Teammitglieder haben, die keine Migrationen erzeugen, besteht natürlich kein Problem, dass Sie eine zentrale Entwicklungs Datenbank gemeinsam nutzen.Of course, if you have team members that aren’t generating migrations, there is no problem having them share a central development database.

Vermeiden automatischer MigrationenAvoid automatic migrations

Die untere Zeile ist, dass automatische Migrationen anfänglich in den Team Umgebungen gut aussehen, aber in Wirklichkeit funktionieren Sie einfach nicht.The bottom line is that automatic migrations initially look good in team environments, but in reality they just don’t work. Wenn Sie wissen möchten, lesen Sie – falls nicht, können Sie mit dem nächsten Abschnitt fortfahren.If you want to know why, keep reading – if not, then you can skip to the next section.

Automatische Migrationen ermöglichen es Ihnen, das Datenbankschema so zu aktualisieren, dass es dem aktuellen Modell entspricht, ohne Code Dateien (Code basierte Migrationen) generieren zu müssen.Automatic migrations allows you to have your database schema updated to match the current model without the need to generate code files (code-based migrations). Automatische Migrationen funktionieren in einer Team Umgebung sehr gut, wenn Sie Sie zuvor verwendet haben und nie Code basierte Migrationen generiert haben.Automatic migrations would work very well in a team environment if you only ever used them and never generated any code-based migrations. Das Problem besteht darin, dass automatische Migrationen eingeschränkt sind und keine Reihe von Vorgängen verarbeiten können – Eigenschaften-/Spalten Umbenennungen, Verschieben von Daten in eine andere Tabelle usw. Um diese Szenarien zu behandeln, erzeugen Sie am Ende Code basierte Migrationen (und Bearbeiten des Gerüst Codes), die zwischen den Änderungen gemischt werden, die von automatischen Migrationen behandelt werden.The problem is that automatic migrations are limited and don’t handle a number of operations – property/column renames, moving data to another table, etc. To handle these scenarios you end up generating code-based migrations (and editing the scaffolded code) that are mixed in between changes that are handled by automatic migrations. Dadurch ist es nahezu unmöglich, Änderungen zusammenzuführen, wenn zwei Entwickler Migrationen einchecken.This makes it near on impossible to merge changes when two developers check in migrations.

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-Team Umgebungen"Video Two: "Migrations - Team Environments"

Auf Grundlage der Konzepte aus dem vorherigen Video behandelt dieser Screencast die Probleme, die in einer Team Umgebung auftreten, und wie Sie Sie beheben können.Building on the concepts from the previous video, this screencast covers the issues that arise in a team environment and how to solve them.

Funktionsweise von MigrationenUnderstanding how migrations works

Der Schlüssel für die erfolgreiche Verwendung von Migrationen in einer Team Umgebung ist ein grundlegendes Verständnis dafür, wie Migrationen Informationen über das Modell zum Erkennen von Modelländerungen nachverfolgen und verwenden.The key to successfully using migrations in a team environment is a basic understanding how migrations tracks and uses information about the model to detect model changes.

Erste MigrationThe first migration

Wenn Sie die erste Migration zu Ihrem Projekt hinzufügen, führen Sie in der Paket-Manager-Konsole etwas wie " Add-Migration First " aus.When you add the first migration to your project, you run something like Add-Migration First in Package Manager Console. Die von diesem Befehl ausgeführten Schritte auf hoher Ebene sind unten dargestellt.The high level steps that this command performs are pictured below.

Erste Migration

Das aktuelle Modell wird aus Ihrem Code berechnet (1).The current model is calculated from your code (1). Die erforderlichen Datenbankobjekte werden dann vom Modell unterschiedlich berechnet (2) – da es sich hierbei um die erste Migration handelt, verwendet das Modell nur ein leeres Modell für den Vergleich.The required database objects are then calculated by the model differ (2) – since this is the first migration the model differ just uses an empty model for the comparison. Die erforderlichen Änderungen werden an den Code-Generator weitergegeben, um den erforderlichen Migrations Code (3) zu erstellen, der dann Ihrer Visual Studio-Projekt Mappe hinzugefügt wird (4).The required changes are passed to the code generator to build the required migration code (3) which is then added to your Visual Studio solution (4).

Zusätzlich zum eigentlichen Migrations Code, der in der Haupt Codedatei gespeichert ist, generiert Migrationen auch einige zusätzliche Code Behind-Dateien.In addition to the actual migration code that is stored in the main code file, migrations also generates some additional code-behind files. Bei diesen Dateien handelt es sich um Metadaten, die von Migrationen verwendet werden. Sie sollten nicht bearbeitet werden.These files are metadata that is used by migrations and are not something you should edit. Eine dieser Dateien ist eine Ressourcen Datei (. resx), die eine Momentaufnahme des Modells zu dem Zeitpunkt enthält, zu dem die Migration generiert wurde.One of these files is a resource file (.resx) that contains a snapshot of the model at the time the migration was generated. Sie sehen, wie dies im nächsten Schritt verwendet wird.You’ll see how this is used in the next step.

An diesem Punkt würden Sie wahrscheinlich " Update-Database " ausführen, um die Änderungen auf die Datenbank anzuwenden, und dann die Implementierung anderer Bereiche Ihrer Anwendung durchführen.At this point you would probably run Update-Database to apply your changes to the database, and then go about implementing other areas of your application.

Nachfolgende MigrationenSubsequent migrations

Wenn Sie zu einem späteren Zeitpunkt einige Änderungen an Ihrem Modell vornehmen – in unserem Beispiel fügen wir dem Blogeine URL -Eigenschaft hinzu.Later you come back and make some changes to your model – in our example we’ll add a Url property to Blog. Anschließend geben Sie einen Befehl wie " Add-Migration addurl " aus, um eine Migration durchzusetzen, um die entsprechenden Daten Bank Änderungen anzuwenden.You would then issue a command such as Add-Migration AddUrl to scaffold a migration to apply the corresponding database changes. Die von diesem Befehl ausgeführten Schritte auf hoher Ebene sind unten dargestellt.The high level steps that this command performs are pictured below.

Zweite Migration

Ebenso wie das letzte Mal wird das aktuelle Modell aus Code (1) berechnet.Just like last time, the current model is calculated from code (1). Dieses Mal werden jedoch Migrationen durchlaufen, damit das vorherige Modell von der neuesten Migration (2) abgerufen wird.However, this time there are existing migrations so the previous model is retrieved from the latest migration (2). Diese beiden Modelle werden untersucht, um die erforderlichen Daten Bank Änderungen zu finden (3), und der Prozess wird wie zuvor abgeschlossen.These two models are diffed to find the required database changes (3) and then the process completes as before.

Dieser Prozess wird für alle weiteren Migrationen verwendet, die Sie dem Projekt hinzufügen.This same process is used for any further migrations that you add to the project.

Warum sollten Sie sich mit der Modell Momentaufnahme beschäftigen?Why bother with the model snapshot?

Sie Fragen sich vielleicht, warum EF mit der Modell Momentaufnahme zu tun hat – warum nicht nur die Datenbank.You may be wondering why EF bothers with the model snapshot – why not just look at the database. Wenn dies der Fall ist, lesen Sie weiter.If so, read on. Wenn Sie nicht interessiert sind, können Sie diesen Abschnitt überspringen.If you’re not interested then you can skip this section.

EF gibt eine Reihe von Gründen für die Modell Momentaufnahme aus:There are a number of reasons EF keeps the model snapshot around:

  • Dadurch kann Ihre Datenbank vom EF-Modell abweichen.It allows your database to drift from the EF model. Diese Änderungen können direkt in der Datenbank vorgenommen werden, oder Sie können den erstellten Code in den Migrationen ändern, um die Änderungen vorzunehmen.These changes can be made directly in the database, or you can change the scaffolded code in your migrations to make the changes. Dies sind einige Beispiele für diese Vorgehensweise:Here are a couple of examples of this in practice:
    • Sie möchten eine eingefügte und aktualisierte Spalte zu einer oder mehreren Tabellen hinzufügen, aber Sie möchten diese Spalten nicht in das EF-Modell einschließen.You want to add an Inserted and Updated to column to one or more of your tables but you don’t want to include these columns in the EF model. Wenn in der Datenbank Migrationen durchgeführt wurden, würde es immer wieder versuchen, diese Spalten jedes Mal zu löschen, wenn Sie ein Gerüst für eine Migration verwenden.If migrations looked at the database it would continually try to drop these columns every time you scaffolded a migration. Mit der Modell Momentaufnahme erkennt EF immer nur legitime Änderungen am Modell.Using the model snapshot, EF will only ever detect legitimate changes to the model.
    • Sie möchten den Text einer gespeicherten Prozedur ändern, die für Updates verwendet wird, um die Protokollierung einzubeziehen.You want to change the body of a stored procedure used for updates to include some logging. Wenn die Migrationen diese gespeicherte Prozedur aus der Datenbank betrachten, wird diese regelmäßig wieder auf die Definition zurückgesetzt, die EF erwartet.If migrations looked at this stored procedure from the database it would continually try and reset it back to the definition that EF expects. Durch die Verwendung der Modell Momentaufnahme erstellt EF immer nur einen gerüstalten Code, um die gespeicherte Prozedur zu ändern, wenn Sie die Form der Prozedur im EF-Modell ändern.By using the model snapshot, EF will only ever scaffold code to alter the stored procedure when you change the shape of the procedure in the EF model.
    • Die gleichen Prinzipien gelten für das Hinzufügen zusätzlicher Indizes, einschließlich zusätzlicher Tabellen in der Datenbank, die Zuordnung von EF zu einer Daten Bank Sicht, die sich über einer Tabelle befindet, usw.These same principles apply to adding extra indexes, including extra tables in your database, mapping EF to a database view that sits over a table, etc.
  • Das EF-Modell enthält mehr als nur die Form der Datenbank.The EF model contains more than just the shape of the database. Das gesamte Modell ermöglicht Migrationen, Informationen zu den Eigenschaften und Klassen in Ihrem Modell und deren Zuordnung zu den Spalten und Tabellen zu überprüfen.Having the entire model allows migrations to look at information about the properties and classes in your model and how they map to the columns and tables. Diese Informationen ermöglichen es, dass Migrationen in dem Code, den Sie Gerüsten, intelligenter werden.This information allows migrations to be more intelligent in the code that it scaffolds. Wenn Sie z. b. den Namen der Spalte ändern, die eine Eigenschaft migriert, können Sie die Umbenennung erkennen, indem Sie sehen, dass es sich um dieselbe Eigenschaft handelt – etwas, das nicht ausgeführt werden kann, wenn Sie nur über das Datenbankschema verfügen.For example, if you change the name of the column that a property maps to migrations can detect the rename by seeing that it’s the same property – something that can’t be done if you only have the database schema. 

Was verursacht Probleme in Team Umgebungen?What causes issues in team environments

Der im vorherigen Abschnitt behandelte Workflow funktioniert hervorragend, wenn Sie ein einzelner Entwickler an einer Anwendung arbeiten.The workflow covered in the previous section works great when you are a single developer working on an application. Es funktioniert auch gut in einer Team Umgebung, wenn Sie die einzige Person sind, die Änderungen am Modell vornimmt.It also works well in a team environment if you are the only person making changes to the model. In diesem Szenario können Sie Modelländerungen vornehmen, Migrationen generieren und diese an die Quell Code Verwaltung senden.In this scenario you can make model changes, generate migrations and submit them to your source control. Andere Entwickler können Ihre Änderungen synchronisieren und Update-Database ausführen, damit die Schema Änderungen angewendet werden.Other developers can sync your changes and run Update-Database to have the schema changes applied.

Es treten Probleme auf, wenn mehrere Entwickler Änderungen am EF-Modell vornehmen und gleichzeitig an die Quell Code Verwaltung senden.Issues start to arise when you have multiple developers making changes to the EF model and submitting to source control at the same time. Was EF fehlt, ist eine erstklassige Möglichkeit, ihre lokalen Migrationen mit Migrationen zusammenzuführen, die von einem anderen Entwickler seit der letzten Synchronisierung an die Quell Code Verwaltung übermittelt wurden.What EF lacks is a first class way to merge your local migrations with migrations that another developer has submitted to source control since you last synced.

Ein Beispiel für einen MergekonfliktAn example of a merge conflict

Zunächst sehen wir uns ein konkretes Beispiel für einen solchen Mergekonflikt an.First let’s look at a concrete example of such a merge conflict. Wir arbeiten mit dem Beispiel fort, das wir zuvor gesehen haben.We’ll continue on with the example we looked at earlier. Als Ausgangspunkt gehen wir davon aus, dass die Änderungen aus dem vorherigen Abschnitt vom ursprünglichen Entwickler eingeglichen wurden.As a starting point let’s assume the changes from the previous section were checked in by the original developer. Wir verfolgen zwei Entwickler nach, wenn Sie Änderungen an der Codebasis vornehmen.We’ll track two developers as they make changes to code base.

Wir verfolgen das EF-Modell und die Migrationen durch eine Reihe von Änderungen.We’ll track the EF model and the migrations thru a number of changes. Als Ausgangspunkt haben beide Entwickler mit dem Quellcodeverwaltungs-Repository synchronisiert, wie in der folgenden Abbildung dargestellt.For a starting point, both developers have synced to the source control repository, as depicted in the following graphic.

Startpunkt

Developer # 1 und Developer # 2 nimmt nun einige Änderungen am EF-Modell in der lokalen Codebasis vor.Developer #1 and developer #2 now makes some changes to the EF model in their local code base. Entwickler # 1 fügt dem Blog – eine Bewertungs Eigenschaft hinzu und generiert eine addrating -Migration, um die Änderungen auf die Datenbank anzuwenden.Developer #1 adds a Rating property to Blog – and generates an AddRating migration to apply the changes to the database. Developer # 2 fügt dem Blog – eine Readers -Eigenschaft hinzu und generiert die entsprechende Migration von adressadern .Developer #2 adds a Readers property to Blog – and generates the corresponding AddReaders migration. Beide Entwickler führen Update-Databaseaus, um die Änderungen auf Ihre lokalen Datenbanken anzuwenden und dann die Entwicklung der Anwendung fortzusetzen.Both developers run Update-Database, to apply the changes to their local databases, and then continue developing the application.

Hinweis

Migrationen wird ein Zeitstempel vorangestellt. Daher stellt unsere Grafik dar, dass die Migration der adressader von Developer # 2 nach der Migration von Developer # 1 erfolgt.Migrations are prefixed with a timestamp, so our graphic represents that the AddReaders migration from Developer #2 comes after the AddRating migration from Developer #1. Ob Entwickler # 1 oder # 2 die Migration zuerst generiert haben, ist kein Unterschied zu den Problemen bei der Arbeit in einem Team oder dem Verfahren zum Zusammenführen der Daten, die wir im nächsten Abschnitt betrachten werden.Whether developer #1 or #2 generated the migration first makes no difference to the issues of working in a team, or the process for merging them that we’ll look at in the next section.

Lokale Änderungen

Es ist ein glücklicher Tag für Developer # 1, da Sie Ihre Änderungen zuerst übermitteln.It’s a lucky day for Developer #1 as they happen to submit their changes first. Da keine andere Person eingehakt hat, weil Sie Ihr Repository synchronisiert haben, können Sie Ihre Änderungen nur übermitteln, ohne eine Zusammenführung auszuführen.Because no one else has checked in since they synced their repository, they can just submit their changes without performing any merging.

Änderungen senden

Jetzt ist es an der Zeit # , Entwickler 2 zu übermitteln.Now it’s time for Developer #2 to submit. Sie sind nicht so glücklich.They aren’t so lucky. Da eine andere Person Änderungen gesendet hat, seit Sie synchronisiert wurden, müssen Sie die Änderungen abrufen und zusammenführen.Because someone else has submitted changes since they synced, they will need to pull down the changes and merge. Das Quell Code Verwaltungssystem kann die Änderungen wahrscheinlich auf Codeebene automatisch zusammenführen, da Sie sehr einfach sind.The source control system will likely be able to automatically merge the changes at the code level since they are very simple. Der Status des # lokalen Repository von Developer 2 nach der Synchronisierung wird in der folgenden Abbildung dargestellt.The state of Developer #2’s local repository after syncing is depicted in the following graphic. 

Aus Quell Code Verwaltung abrufen

Auf dieser Stufe # kann Developer 2 Update-Database ausführen, wodurch die neue Migrations AddRating Migration (die noch nicht auf # die Datenbank von Developer 2 angewendet wurde) erkannt und angewendet wird.At this stage Developer #2 can run Update-Database which will detect the new AddRating migration (which hasn’t been applied to Developer #2’s database) and apply it. Nun wird die Spalte Bewertung der Tabelle Blogs hinzugefügt, und die Datenbank ist mit dem Modell synchron.Now the Rating column is added to the Blogs table and the database is in sync with the model.

Es gibt jedoch einige Probleme:There are a couple of problems though:

  1. Obwohl Update-Database die Migration addrating anwendet, wird auch eine Warnung ausgegeben: die Datenbank kann nicht so aktualisiert werden, dass Sie mit dem aktuellen Modell identisch ist, weil ausstehende Änderungen vorhanden sind und die automatische Migration deaktiviert ist...Although Update-Database will apply the AddRating migration it will also raise a warning: Unable to update database to match the current model because there are pending changes and automatic migration is disabled… Das Problem besteht darin, dass in der in der letzten Migration (demadressader) gespeicherten Modell Momentaufnahme die Bewertungs Eigenschaft im Blog fehlt (da Sie beim Generieren der Migration nicht Teil des Modells war).The problem is that the model snapshot stored in the last migration (AddReader) is missing the Rating property on Blog (since it wasn’t part of the model when the migration was generated). Code First erkennt, dass das Modell in der letzten Migration nicht mit dem aktuellen Modell identisch ist, und löst die Warnung aus.Code First detects that the model in the last migration doesn’t match the current model and raises the warning.
  2. Das Ausführen der Anwendung führt zu einer InvalidOperationException, die besagt, dass sichdas Modell, das den bloggingcontext-Kontext unterstützt, seit der Erstellung der Datenbank geändert hat. Verwenden Sie Code First-Migrationen, um die Datenbank zu aktualisieren... "Running the application would result in an InvalidOperationException stating that “The model backing the 'BloggingContext' context has changed since the database was created. Consider using Code First Migrations to update the database…” Das Problem ist, dass die in der letzten Migration gespeicherte Modell Momentaufnahme nicht mit dem aktuellen Modell identisch ist.Again, the problem is the model snapshot stored in the last migration doesn’t match the current model.
  3. Schließlich würden wir erwarten, dass durch das Ausführen von " Add-Migration " nun eine leere Migration generiert wird (da es keine Änderungen gibt, die auf die Datenbank angewendet werden müssen).Finally, we would expect running Add-Migration now would generate an empty migration (since there are no changes to apply to the database). Doch da Migrationen das aktuelle Modell mit dem der letzten Migration vergleichen (was die Bewertungs Eigenschaft fehlt), wird ein weiterer AddColumn -Befehl zum Hinzufügen in der Bewertungs Spalte erstellt.But because migrations compares the current model to the one from the last migration (which is missing the Rating property) it will actually scaffold another AddColumn call to add in the Rating column. Natürlich würde diese Migration bei Update-Database fehlschlagen, da die Bewertungs Spalte bereits vorhanden ist.Of course, this migration would fail during Update-Database because the Rating column already exists.

Auflösen des MergekonfliktsResolving the merge conflict

Die gute Nachricht ist, dass es nicht zu schwierig ist, den Merge manuell zu behandeln – vorausgesetzt, Sie haben ein Verständnis für die Funktionsweise von Migrationen.The good news is that it’s not too hard to deal with the merge manually – provided you have an understanding of how migrations works. Wenn Sie also diesen Abschnitt übersprungen haben...So if you’ve skipped ahead to this section… Leider müssen Sie den Rest des Artikels zuerst lesen.sorry, you need to go back and read the rest of the article first!

Es gibt zwei Möglichkeiten: am einfachsten ist es, eine leere Migration zu generieren, die das richtige aktuelle Modell als Momentaufnahme hat.There are two options, the easiest is to generate a blank migration that has the correct current model as a snapshot. Die zweite Option besteht darin, die Momentaufnahme in der letzten Migration zu aktualisieren, damit die richtige Modell Momentaufnahme vorhanden ist.The second option is to update the snapshot in the last migration to have the correct model snapshot. Die zweite Option ist ein wenig schwieriger und kann nicht in jedem Szenario verwendet werden, aber Sie ist auch sauberer, da Sie keine zusätzliche Migration hinzufügen muss.The second option is a little harder and can’t be used in every scenario, but it’s also cleaner because it doesn’t involve adding an extra migration.

Option 1: Hinzufügen einer leeren Migration "Merge"Option 1: Add a blank ‘merge’ migration

Bei dieser Option generieren wir lediglich eine leere Migration, um sicherzustellen, dass die aktuelle Migration die richtige Modell Momentaufnahme enthält.In this option we generate a blank migration solely for the purpose of making sure the latest migration has the correct model snapshot stored in it.

Diese Option kann unabhängig von der Person verwendet werden, die die letzte Migration generiert hat.This option can be used regardless of who generated the last migration. In dem Beispiel, das dem Entwickler # 2 folgt, wird die Zusammenführung übernommen und die letzte Migration generiert.In the example we’ve been following Developer #2 is taking care of the merge and they happened to generate the last migration. Diese Schritte können jedoch auch verwendet werden, wenn Developer # 1 die letzte Migration generiert hat.But these same steps can be used if Developer #1 generated the last migration. Diese Schritte gelten auch, wenn mehrere Migrationen beteiligt sind – wir haben gerade zwei untersucht, um Sie einfach zu halten.The steps also apply if there are multiple migrations involved – we’ve just been looking at two in order to keep it simple.

Der folgende Prozess kann für diese Vorgehensweise verwendet werden, beginnend ab dem Zeitpunkt, an dem Sie wissen, dass Sie über Änderungen verfügen, die über die Quell Code Verwaltung synchronisiert werden müssen.The following process can be used for this approach, starting from the time you realize you have changes that need to be synced from source control.

  1. Stellen Sie sicher, dass alle ausstehenden Modelländerungen in der lokalen Codebasis in eine Migration geschrieben wurden.Ensure any pending model changes in your local code base have been written to a migration. Mit diesem Schritt wird sichergestellt, dass Sie keine legitimen Änderungen übersehen, wenn es an der Zeit ist, die leere Migration zu generieren.This step ensures you don’t miss any legitimate changes when it comes time to generate the blank migration.
  2. Mit Quell Code Verwaltung synchronisieren.Sync with source control.
  3. Führen Sie Update-Database aus, um alle neuen Migrationen anzuwenden, die andere Entwickler eingecheckten.Run Update-Database to apply any new migrations that other developers have checked in. Hinweis: Wenn Sie keine Warnungen vom Update-Database Befehl erhalten, gab es keine neuen Migrationen von anderen Entwicklern, und es besteht keine Notwendigkeit, eine weitere Zusammenführung auszuführen.Note: if you don’t get any warnings from the Update-Database command then there were no new migrations from other developers and there is no need to perform any further merging.
  4. Ausführen von Add-Migration < Pick _ a _ Name > – ignorechanges (z. b. Add-Migration Merge – ignorechanges).Run Add-Migration <pick_a_name> –IgnoreChanges (for example, Add-Migration Merge –IgnoreChanges). Dadurch wird eine Migration mit allen Metadaten (einschließlich einer Momentaufnahme des aktuellen Modells) generiert, aber alle Änderungen, die erkannt werden, beim Vergleich des aktuellen Modells mit der Momentaufnahme in den letzten Migrationen werden ignoriert (was bedeutet, dass Sie eine leere up -und down -Methode erhalten).This generates a migration with all the metadata (including a snapshot of the current model) but will ignore any changes it detects when comparing the current model to the snapshot in the last migrations (meaning you get a blank Up and Down method).
  5. Führen Sie Update-Database aus, um die neueste Migration mit den aktualisierten Metadaten erneut anzuwenden.Run Update-Database to re-apply the latest migration with the updated metadata.
  6. Setzen Sie die Entwicklung fort, oder übermitteln Sie die Quell Code Verwaltung (nachdem Sie die Komponententests natürlich ausgeführt haben).Continue developing, or submit to source control (after running your unit tests of course).

#Nach diesem Ansatz wird der lokale Codebasis von Developer 2 angezeigt.Here is the state of Developer #2’s local code base after using this approach.

Zusammenführen der Migration

Option 2: Aktualisieren der Modell Momentaufnahme in der letzten MigrationOption 2: Update the model snapshot in the last migration

Diese Option ist mit Option 1 sehr ähnlich, entfernt jedoch die zusätzliche leere Migration – da wir Sie sehen können, wer zusätzliche Code Dateien in der Projekt Mappe wünscht.This option is very similar to option 1 but removes the extra blank migration – because let’s face it, who wants extra code files in their solution.

Diese Vorgehensweise ist nur möglich, wenn die aktuelle Migration nur in der lokalen Codebasis vorhanden ist und noch nicht an die Quell Code Verwaltung übermittelt wurde (z. b. wenn die letzte Migration vom Benutzer generiert wurde, der die Zusammenführung durchgeführt hat).This approach is only feasible if the latest migration exists only in your local code base and has not yet been submitted to source control (for example, if the last migration was generated by the user doing the merge). Das Bearbeiten der Metadaten von Migrationen, die andere Entwickler möglicherweise bereits auf Ihre Entwicklungs Datenbank angewendet haben – oder noch schlimmer auf eine Produktionsdatenbank – kann zu unerwarteten Nebeneffekten führen.Editing the metadata of migrations that other developers may have already applied to their development database – or even worse applied to a production database – can result in unexpected side effects. Während des Vorgangs wird für die letzte Migration in der lokalen Datenbank ein Rollback ausgeführt und mit aktualisierten Metadaten erneut angewendet.During the process we’re going to roll back the last migration in our local database and re-apply it with updated metadata.

Während sich die letzte Migration nur in der lokalen Codebasis befinden muss, gibt es keine Einschränkungen hinsichtlich der Anzahl oder Reihenfolge der Migrationen, die Sie fortsetzen.While the last migration needs to just be in the local code base there are no restrictions to the number or order of migrations that proceed it. Es können mehrere Migrationen von mehreren verschiedenen Entwicklern vorhanden sein, und die gleichen Schritte werden angewendet – wir haben gerade nur zwei untersucht, um Sie einfach zu halten.There can be multiple migrations from multiple different developers and the same steps apply– we’ve just been looking at two in order to keep it simple.

Der folgende Prozess kann für diese Vorgehensweise verwendet werden, beginnend ab dem Zeitpunkt, an dem Sie wissen, dass Sie über Änderungen verfügen, die über die Quell Code Verwaltung synchronisiert werden müssen.The following process can be used for this approach, starting from the time you realize you have changes that need to be synced from source control.

  1. Stellen Sie sicher, dass alle ausstehenden Modelländerungen in der lokalen Codebasis in eine Migration geschrieben wurden.Ensure any pending model changes in your local code base have been written to a migration. Mit diesem Schritt wird sichergestellt, dass Sie keine legitimen Änderungen übersehen, wenn es an der Zeit ist, die leere Migration zu generieren.This step ensures you don’t miss any legitimate changes when it comes time to generate the blank migration.
  2. Synchronisierung mit der Quell Code Verwaltung.Sync with the source control.
  3. Führen Sie Update-Database aus, um alle neuen Migrationen anzuwenden, die andere Entwickler eingecheckten.Run Update-Database to apply any new migrations that other developers have checked in. Hinweis: Wenn Sie keine Warnungen vom Update-Database Befehl erhalten, gab es keine neuen Migrationen von anderen Entwicklern, und es besteht keine Notwendigkeit, eine weitere Zusammenführung auszuführen.Note: if you don’t get any warnings from the Update-Database command then there were no new migrations from other developers and there is no need to perform any further merging.
  4. Führen Sie **Update-Database – targetmigration < zweite _ Letzte _ Migration > ** aus (in dem Beispiel, das folgt, wäre " Update-Database" – targetmigration addrating).Run Update-Database –TargetMigration <second_last_migration> (in the example we’ve been following this would be Update-Database –TargetMigration AddRating). Dadurch wird die Datenbank wieder in den Zustand der zweiten letzten Migration versetzt – wodurch die letzte Migration von der Datenbank deaktiviert wird.This rolls the database back to the state of the second last migration – effectively ‘un-applying’ the last migration from the database. Hinweis: dieser Schritt ist erforderlich, damit die Metadaten der Migration sicher bearbeitet werden können, da die Metadaten auch in der _ _ migrationshistorytable der Datenbank gespeichert werden. Aus diesem Grund sollten Sie diese Option nur verwenden, wenn die letzte Migration nur in der lokalen Codebasis erfolgt. Wenn die letzte Migration für andere Datenbanken angewendet wurde, müssten Sie auch ein Rollback durchführen und die letzte Migration erneut anwenden, um die Metadaten zu aktualisieren.Note: This step is required to make it safe to edit the metadata of the migration since the metadata is also stored in the __MigrationsHistoryTable of the database. This is why you should only use this option if the last migration is only in your local code base. If other databases had the last migration applied you would also have to roll them back and re-apply the last migration to update the metadata. 
  5. Führen Sie den vollständigen Namen der Add-Migration < _ _ einschließlich _ Zeitstempel _ der _ letzten _ Migration aus > (in dem Beispiel, das folgt, wie etwa Add-Migration 201311062215252- _ adressader).Run Add-Migration <full_name_including_timestamp_of_last_migration> (in the example we’ve been following this would be something like Add-Migration 201311062215252_AddReaders). Hinweis: Sie müssen den Zeitstempel einschließen, damit Migrationen wissen, dass Sie die vorhandene Migration bearbeiten möchten, anstatt eine neue zu Gerüstbau.Note: You need to include the timestamp so that migrations knows you want to edit the existing migration rather than scaffolding a new one. Dadurch werden die Metadaten für die letzte Migration entsprechend dem aktuellen Modell aktualisiert.This will update the metadata for the last migration to match the current model. Wenn der Befehl abgeschlossen ist, erhalten Sie die folgende Warnung, aber genau das ist das, was Sie möchten.You’ll get the following warning when the command completes, but that’s exactly what you want. "Nur der Designer Code für die Migration der 201311062215252 _ -adressader wurde neu gerüsteht. Verwenden Sie den Parameter "-Force", um die gesamte Migration neu zu erstellen.Only the Designer Code for migration '201311062215252_AddReaders' was re-scaffolded. To re-scaffold the entire migration, use the -Force parameter.”
  6. Führen Sie Update-Database aus, um die neueste Migration mit den aktualisierten Metadaten erneut anzuwenden.Run Update-Database to re-apply the latest migration with the updated metadata.
  7. Setzen Sie die Entwicklung fort, oder übermitteln Sie die Quell Code Verwaltung (nachdem Sie die Komponententests natürlich ausgeführt haben).Continue developing, or submit to source control (after running your unit tests of course).

#Nach diesem Ansatz wird der lokale Codebasis von Developer 2 angezeigt.Here is the state of Developer #2’s local code base after using this approach.

Aktualisierte Metadaten

ZusammenfassungSummary

Bei der Verwendung von Code First-Migrationen in einer Team Umgebung gibt es einige Herausforderungen.There are some challenges when using Code First Migrations in a team environment. Ein grundlegendes Verständnis der Funktionsweise von Migrationen und einige einfache Ansätze zum Auflösen von Mergekonflikten erleichtern es Ihnen, diese Herausforderungen zu meistern.However, a basic understanding of how migrations works and some simple approaches for resolving merge conflicts make it easy to overcome these challenges.

Das grundlegende Problem sind falsche Metadaten, die in der letzten Migration gespeichert wurden.The fundamental issue is incorrect metadata stored in the latest migration. Dies bewirkt, dass Code First fälschlicherweise erkennen, dass das aktuelle Modell und das Datenbankschema nicht identisch sind, und dass bei der nächsten Migration falscher Code Gerüstbau ist.This causes Code First to incorrectly detect that the current model and database schema don’t match and to scaffold incorrect code in the next migration. Diese Situation kann umgangen werden, indem eine leere Migration mit dem richtigen Modell erzeugt oder die Metadaten in der letzten Migration aktualisiert werden.This situation can be overcome by generating a blank migration with the correct model, or updating the metadata in the latest migration.