7

Angenommen, mein Objekt hat ein Feld Name, und ich möchte es in FirstName und LastName Felder teilen. Oder vielleicht hat es eine Adress-Zeichenfolge und ich bin Lat und Lng Felder hinzufügen, die Geocodierung erfordern. Usw.Wie sollte ich eine Entity Framework-Migration schreiben, die Daten transformiert (vorzugsweise mit dem DbContext)?

Ich habe erwartet, Zugriff auf meine DbContext in den Up() und Down() Methoden, aber alles, was ich (neben den eingebauten Funktionen) finden konnte, ist der .Sql() Aufruf. Dies reicht aus, um Spalten hinzuzufügen und zu entfernen, aber nicht, um vorhandene Daten in neue Formate umzuwandeln.

Ist es sicher, meinen DbContext innerhalb eines Up() - Aufrufs zu referenzieren? Oder gibt es ein anderes empfohlenes Muster für Implementierungsmigrationen, die mehr als triviales SQL erfordern?

Antwort

0

Nein, Sie können DbContext nicht innerhalb Up Methode verwenden, da es bereits neues Modell verweist, aber Ihre Datenbank immer noch das alte Modell anvisiert.

Edit:

Alle Datenmigrationen müssen durch Sql erfolgen. Sie können beispielsweise eine temporäre Tabelle erstellen, alte Daten in eine temporäre Tabelle verschieben, die Migration der Tabellenstruktur verwenden und Daten aus der temporären Tabelle zurück in das Original verschieben, indem Sie einige Umwandlungen direkt in SQL verwenden. Das Teilen von varchar-Werten sollte keine große Sache sein.

+2

Meine erforderlichen Transformationen können nicht als SQL ausgeführt werden (das Aufteilen von Varchars war ein radikal vereinfachtes Beispiel). Diese Art der Migrationsoperation ist in einem Duck-ORM wie ActiveRecord sehr natürlich, aber es ist sinnvoll, dass dies ein Bereich ist, in dem der EF-Ansatz Probleme hätte. – Seth

0

Anstatt zu versuchen, den Namen in zwei verschiedene Felder aufzuteilen, sollten Sie Ihre Migration überdenken. Manchmal könnte es am besten inszeniert werden. Ich kann mir zwei Möglichkeiten vorstellen, wie Sie Ihre Transformation durchführen können.

Migrationspfad # 1: Neue Felder, dann alt Löschen

  1. Migration Erstellen Sie für neues Feld für Vornamen und Nachnamen, und im Up() -Methode, haben Sie immer noch das Feld Namen, spaltete es , Einfügen in erste und letzte Felder.
  2. Erstellen Sie eine weitere Migration, um das alte Feld Name zu entfernen.

Migrationspfad # 2: Repurpose und Umbenennen

  1. eine Migration Erstellen Sie das Feld Nachname Hinzufügen und Umbenennen Name Vorname, der Nachname Daten verschieben, ändern Sie die umbenannte Erste/Feld Name halte nur den Vornamen.

Beide Wege haben Vor- und Nachteile. Und unabhängig von der Komplexität Ihrer Transformation sollten Sie in der Lage sein, sie in logische Phasen zu zerlegen, um das Ziel zu erreichen.

Verwandte Themen