Zresetuj migracje Entity-Framework


299

Zepsułem migracje, użyłem IgnoreChangesprzy pierwszej migracji, ale teraz chcę usunąć wszystkie moje migracje i rozpocząć od pierwszej migracji z całą logiką.

Kiedy usuwam migracje w folderze i próbuję Add-Migration nie generuje pełnego pliku (jest pusty - ponieważ nie wprowadziłem żadnych zmian od czasu mojej ostatniej, ale teraz usuniętej migracji).

Czy jest jakieś polecenie Wyłącz migrację , aby móc ponownie uruchomić Enable-Migrations?



3
Jedna ważna uwaga, jeśli masz wiele ciągów połączeń: określ, który z nich ma być użyty podczas resetowania migracji, w przeciwnym razie spróbuje zastosować oba, co może powodować problemy w przypadku rozbieżności.
Jeroen Vannevel

Uwaga: Jeśli nie usunąłeś swoich migracji (używasz kontroli wersji, prawda?), Mógłbyś zaktualizować bazę danych do pierwszej migracji, a następnie usunąć ograniczenie i utworzyć nowe migracje z tego miejsca. Zobacz tutaj: stackoverflow.com/a/23793384/309634
DarcyThomas

Odpowiedzi:


446

Musisz :

  1. Usuń stan: Usuń folder migracji w swoim projekcie; I
  2. Usuń __MigrationHistorytabelę z bazy danych (może znajdować się pod tabelami systemowymi); Następnie
  3. Uruchom następujące polecenie w konsoli Menedżera pakietów:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Używaj z lub bez -EnableAutomaticMigrations

  4. I wreszcie możesz uruchomić:

    Add-Migration Initial

5
^^ Zrozumiałem - to był błąd TFS - jeśli używasz TFS, musisz wykonać odprawę przed uruchomieniem polecenia „Enable-Migrations ...”. : D
BrainSlugs83

7
Jeśli nie korzystasz z kontroli wersji, zapisz wartości Seed przed usunięciem!
RyanJMcGowan

77
@RyanJMcGowan, jeśli nie używasz kontroli wersji, zasługujesz na utratę pracy. :-)
Mike Cole

4
@Tood. +1 do tego. Zaoszczędził mi dużo czasu. Teraz, gdyby tylko zespół EF mógł to wszystko włączyć do polecenia Reset-Migrations. Może EF 6 ...
Gerald Davis

24
W przypadku istniejącej bazy danych należy skomentować treść funkcji „W górę”. W przeciwnym razie wystąpi błąd po uruchomieniu „Aktualizuj bazę danych”, narzekałbyś, że tabela już istnieje
Guy

149

Problem: zlikwidowałeś migracje i chcesz je zresetować bez usuwania istniejących tabel.

Problem: Nie można zresetować migracji z istniejącymi tabelami w bazie danych, ponieważ EF chce tworzyć tabele od zera.

Co robić:

  1. Usuń istniejące migracje z tabeli Migrations_History.

  2. Usuń istniejące migracje z folderu migracji.

  3. Uruchom reset migracji migracji. Spowoduje to utworzenie migracji w folderze Migracja, która obejmuje tworzenie tabel (ale nie uruchomi go, więc nie spowoduje błędu).

  4. Teraz musisz utworzyć początkowy wiersz w tabeli MigrationHistory, aby EF miał migawkę bieżącego stanu. EF zrobi to, jeśli zastosujesz migrację. Nie można jednak zastosować właśnie wykonanej migracji, ponieważ tabele już istnieją w bazie danych. Przejdź do Migracji i skomentuj cały kod w metodzie „W górę”.

  5. Teraz uruchom aktualizację bazy danych. Zastosuje migrację (nie zmieniając bazy danych) i utworzy wiersz migawki w MigrationHistory.

Zresetowałeś teraz migracje i możesz kontynuować normalne migracje.


11
To jedyna odpowiedź, która zadziałała dla mnie. Wydaje się, że zaakceptowana odpowiedź nie rozwiązuje problemu tego, co dzieje się po uruchomieniu aktualizacji bazy danych lub aplikacji (w zależności od używanego inicjalizatora). Spróbuje uruchomić migrację i wprowadzić zmiany, które już istnieją. Chyba że coś mi umknie.
regularmike

2
Jest to również bardziej elastyczna odpowiedź. W moim przypadku były pewne zmiany, których potrzebowałem, a niektóre nie. Mógłbym po prostu zachować przydatne rzeczy w mojej Up ().
tec-goblin

1
@ H.Johnson, patrzyłem na to. Czy masz na to pytanie?
Greg Gum

2
Należy pamiętać, że od wersji EF 6.0 tabela _MigrationsHistory zawiera migracje wielu kontekstów DB. Usunięcie go może powodować problemy, należy usuwać tylko wiersze, w których ContextKey = nazwa migracji. Również po 2 powyżej musiałem ponownie włączyć migracje
David Waterworth,

2
Zasadniczo ta sama odpowiedź, z rozszerzonym przykładem (ze zrzutami ekranu): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

Co powiesz na

Update-Database TargetMigration: $InitialDatabase

w konsoli Menedżera pakietów? Powinien zresetować wszystkie aktualizacje do bardzo wczesnego stanu.

Odnośnik: Migracje pierwszego kodu - Migracja do określonej wersji (w tym obniżenie wersji)


Myślę, że moją główną frustracją nie było już zaufanie do migracji w celu dokładnego utrzymania stanu. I w rezultacie chce zacząć od zera.
Todd

@Todd, potknąłem się i nie zawsze było jasne, czy powinienem usunąć pliki migracji, aby zacząć wszystko od nowa. Teraz działa następująco: 1. powróć do początkowej za pomocą polecenia „Update-Database –TargetMigration: $ InitialDatabase”. 2. Usuń wszystkie pliki migracji (nazwane przy użyciu yyyyMMddHHmmssx_Name.cs lub .vb) 3. Odśwież aktualizację za pomocą polecenia „add-Migration -Name some_name”. 4. Wydaj aktualizację, aby wpłynąć na bazę danych, używając „update-Database”. Mam nadzieję, że Ci się uda.
Chris Voon

W moim przypadku sugerowane polecenie w tej odpowiedzi spowodowało błędy SQL.
Justin Skiles

co to powinno znaczyć „InitialDatabase”? czy usunie tabele lub kolumny już utworzone w bazie danych?
Serge

16

Aby to naprawić, musisz:

  1. Usuń wszystkie pliki * .cs z folderu migracji.

  2. Usuń tabelę _MigrationHistory w bazie danych

  3. Biegać Enable-Migrations -EnableAutomaticMigrations -Force

  4. Biegać Add-Migration Reset

Następnie w public partial class Reset : DbMigrationklasie musisz skomentować wszystkie istniejące i bieżące tabele:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Jeśli przegapisz ten bit, wszystko zawiedzie i musisz zacząć od nowa!

  1. Teraz uruchom Update-Database -verbose

Powinno to zakończyć się powodzeniem, jeśli poprawnie wykonałeś powyższe czynności, a teraz możesz kontynuować normalnie.


2
Zamiast komentować wszystko, możesz także napisać „return;” w pierwszym wierszu metody Up ().
Chainstair

6

Biorąc pod uwagę to, że wciąż pojawia się, gdy szukamy EF w .NET Core, opublikuję tutaj swoją odpowiedź (ponieważ bardzo mnie prześladuje). Zauważ, że istnieją pewne subtelności w wersji EF 6 .NET (Bez polecenia początkowego i trzeba będzie usunąć pliki „Migawka”)

(Testowane w .NET Core 2.1)

Oto kroki:

  1. Usuń _efmigrationhistorytabelę.
  2. Wyszukaj całe rozwiązanie dla plików, które zawierają Snapshot w nazwie, na przykład ApplicationDbContextSnapshot.csi usuń je.
  3. Odbuduj swoje rozwiązanie
  4. Biegać Add-Migration InitialMigration

Uwaga: musisz usunąć WSZYSTKIE pliki migawek . Spędziłem niezliczone godziny po prostu usuwając bazę danych ... Jeśli to nie zrobisz, wygeneruje pustą migrację.

Ponadto w punkcie 3 możesz po prostu nazwać swoją migrację, jak chcesz.

Oto kilka dodatkowych zasobów: asp.net CORE Migracje wygenerowane puste

Zresetuj migracje Entity Framework 7


3

W EntityFramework 6 spróbuj:

Add-Migration Initial

w celu zaktualizowania początkowego pliku migracji.


3

W Entity Framework Core.

  1. Usuń wszystkie pliki z folderu migracji.
  2. Wpisz w konsoli

baza danych dotnet ef drop -f -v

migracje dotnet ef dodają wartość początkową

Aktualizacja bazy danych dotnet ef


2

Mój problem polegał na tym, że ręcznie usunąłem folder Migracje. Zrobiłem to, ponieważ chciałem wykonać kopię zapasową zawartości, więc po prostu wyciągnąłem folder z projektu. Później rozwiązałem problem, umieszczając go ponownie (po utworzeniu kopii zapasowej), a następnie usuwając folder Migracje, klikając go prawym przyciskiem myszy w Eksploratorze rozwiązań i wybierając polecenie Usuń z menu podręcznego.


1

W EF6

  1. Usuń wszystkie pliki z folderu „migracje” ... Ale nie „początkowe tworzenie” ani „konfiguracja”.
  2. Usuń bazę danych.
  3. Teraz biegnij Add-Migration Initial.
  4. Teraz możesz „zaktualizować bazę danych” i wszystko będzie dobrze.

1

Usuń ten Migrationsfolder, Cleana następnie Rebuildprojekt. To zadziałało dla mnie. Przed Clean and Rebuild mówiono, że migracja już istnieje, ponieważ w pamięci podręcznej nie została jeszcze usunięta.


0

Ta metoda nie wymaga usunięcia __MigrationHistorytabeli, więc nie musisz wkładać bazy danych do wdrożenia.

  1. Usuń istniejące migracje z folderu Migracje.
  2. W konsoli Menedżera pakietów uruchom Add-Migration ResetMigrations
  3. Wyczyść historię migracji w Up()metodzie:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

W Net Core 3.0:

Nie udało mi się znaleźć sposobu na zresetowanie migracji .

Miałem też problemy z uszkodzonymi migracjami, a podane tutaj odpowiedzi nie działały dla mnie. Mam internetowy interfejs API .Net Core 3.0, a gdzieś w ostatnim miesiącu bezpośrednio edytowałem bazę danych. Tak, zrobiłem coś złego, złego.

Sugerowane tutaj strategie spowodowały szereg błędów w konsoli Menedżera pakietów:

  • Migracja o tej nazwie już istnieje
  • Nie można znaleźć migawki
  • „Siła” nie jest rozpoznawanym parametrem

To prawda, że ​​mogłem pominąć krok lub wyczyścić prawidłowe pliki, ale odkryłem, że istnieją sposoby na oczyszczenie tego bez tak brutalnej siły:

  • Usuń migrację z PMC dla każdej migracji według nazwy, w odwrotnej kolejności tworzenia, aż do migracji przerwanej włącznie
  • Add-Migration, aby utworzyć nową migrację, która będzie różnicą między ostatnią dobrą migracją a bieżącym schematem

Teraz, gdy web API jest uruchamiane z pustą bazą danych, poprawnie tworzy wszystkie tabele i właściwości pasujące do modeli encji.

HTH!


0

AKTUALIZACJA 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Twój kontekst.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.