Wie kann ich eine int ID-Spalte mit EF Migration in Guid ändern?

7

Ich benutze den EF-Code-First-Ansatz und möchte das Id -Feld in guid ändern, aber es scheint nicht möglich, unter den Fehler zu kommen.

Dies ist meine erste Migration:

%Vor%

Später wurde mir klar, dass ich meine Spalte Id als GUID verwenden muss, also habe ich meine Modelldatei geändert:

%Vor%

Wenn Add-Migration ChangeDownloadTokenIdToGuid ausgeführt wird, wird diese Datei generiert:

%Vor%

Das Ausführen dieser Datei mit Update-Database verursacht diesen Fehler:

%Vor%

Irgendwelche Ideen, warum das passieren könnte?

    
karlingen 15.03.2016, 21:50
quelle

2 Antworten

13

Es wurde verursacht, weil es unmöglich ist, den vorherigen int -Typ der Id -Spalte in Guid -Typ umzuwandeln (genau diesen Versuch, AlterColumn -Methode auszuführen). Außerdem wird Ihnen durch die Fehlermeldung angezeigt, dass der neue Typ der Id -Spalte für den Typ aus dem Satz: int, bigint, smallint, tinyint oder dezimal oder numerisch mit einer Skalierung von 0 sein kann Es ist möglich, die Konvertierung von int type durchzuführen.

Lösung - fügen Sie einfach die Spalte Id ein und erstellen Sie sie dann mit dem neuen Guid -Typ neu. Ändern Sie die Migration auf diese Weise:

%Vor%
  

P.S. Warum verwenden Sie das DatabaseGeneratedOption.Computed -Attribut nicht?    DatabaseGeneratedOption.Identity ?

    
Slava Utesinov 16.03.2016, 06:58
quelle
7

Obwohl Slava Utesinov funktioniert, funktioniert es nur bei leeren Tabellen oder in Fällen, in denen keine anderen Tabellen auf die Tabelle verweisen, die Sie konvertieren. Diese Antwort hilft also denjenigen, die auf dieser Seite landen, mit einer komplexeren Datenbankeinrichtung.

Im Folgenden finden Sie eine Dienstprogrammfunktion, die Sie in Ihrer Migrationsklasse verwenden können. Diese Funktion sollte über die Funktionen Hoch / Runter aufgerufen werden. Die Funktion behandelt auch Tabellen, die auf die Tabelle verweisen, die Sie von Int in Guid konvertieren möchten. Diese Hilfsfunktion geht davon aus, dass die zu konvertierende Spalte "Id" heißt, sollte aber ansonsten eher generisch sein.

%Vor%

In Ihrem Fall wären also Ihre Up / Down-Funktionen:

%Vor%     
Andreas Willadsen 29.08.2016 12:10
quelle