Nie można wygenerować jawnej migracji w ramach jednostki

96

Dodaję nową migrację, ale ten komunikat pokazuje:

Nie można wygenerować jawnej migracji, ponieważ oczekują następujące jawne migracje: [201203170856167_left]. Zastosuj oczekujące jawne migracje przed próbą wygenerowania nowej jawnej migracji.

Czy ktoś może mi pomóc?

Noman Saeed
źródło
11
Zdarzyło mi się to, gdy przypadkowo przełączyłem projekt startowy na inny. Ty (lub inni to czytający) możesz chcieć to szybko sprawdzić, zanim spróbujesz bardziej dogłębnego rozwiązywania problemów (szczególnie tych, w których musisz rozpocząć usuwanie migracji itp.).
NicholasFolk
W katalogu Migrations znajduje się klasa migracji, która nie jest aktualizowana w _MigrationHistory bazy danych. Usunięcie tej klasy, aby miała ten sam stan zarówno w katalogu migracji, jak iw bazie danych, rozwiązało mój problem.
Aryan Firouzian
1
Zdarza mi się to losowo. Kiedy to się dzieje, pokazuje, że wszystkie moje migracje muszą zostać zastosowane. Muszę ponownie uruchomić Visual Studio, aby zaczął działać, ponieważ mam już wszystko poprawnie skonfigurowane.
Larry Flewwelling

Odpowiedzi:

81

Informuje, że w aplikacji jest jakaś nieprzetworzona migracja i wymaga uruchomienia, Update-Databasezanim będzie można dodać kolejną migrację.

Ladislav Mrnka
źródło
12
Co chcesz odtworzyć początkową migrację? To cię blokuje?
Rebecca
Nie działało dla mnie, Update-Database po prostu dał mi kolejny błąd. Najpierw musiałem usunąć oczekujące pliki.
Vahx
1
Odpowiedź Thomasa była przydatna w moim podobnym przypadku.
Tarek Shawadfy
2
Konieczne może być zadeklarowanie projektu -StartupProject ContentHub.Database
startupowego
2
Update-Databasedaje> Nie można zaktualizować bazy danych, aby pasowała do obecnego modelu, ponieważ są oczekujące zmiany
ASpirin
53

Miałem ten sam problem. Najwyraźniej struktura jednostki generuje ten błąd, gdy nie może połączyć się z bazą danych. Dlatego upewnij się, że możesz uzyskać do niego dostęp, zanim zaczniesz szukać innych problemów.

Robin Dorbell
źródło
1
Dodałbym również, że będzie tak w przypadku przeniesienia pliku App.config do innego projektu lub jeśli po prostu go brakuje w twoim projekcie lub jeśli jest w twoim projekcie, ale jest nieprawidłowo skonfigurowany.
Code Maverick
Ten sam błąd wystąpił po zmianie adresu IP (zdarzyło się to zarówno po zmianie lokalizacji, jak i po zmianie dyn dns). Spowodowało to zaporę w Azure Database, której używamy do unieważnienia logowania. Nieprzydatne migracje EF powodują powyższy błąd zamiast „nie można się zalogować” ...
Victor
8
Inną kwestią, którą chciałbym poruszyć, jest upewnienie się, że projekt startowy zawiera parametry połączenia kontekstu bazy danych. Miałem ten problem, gdy tymczasowo zmieniłem projekt startowy i nie zdawałem sobie sprawy, że inny projekt nie ma tych samych parametrów połączenia.
Gage Trader
Dodawanie do @GageTrader: Miałem wiele projektów startowych, jeden bez konfiguracji i projekt internetowy z EF-config. projekt (repozytorium) z migracjami ma tę samą konfigurację EF w pliku app.config co projekt sieci Web. ale nawet gdy wybrałem projekt repozytorium jako projekt startowy, nie działał, ale kiedy ustawiłem projekt sieciowy na uruchamianie, tak się stało.
JimiSweden
Musiałem wyraźnie określić parametr -ConnectionString, który załatwił sprawę
Brian Colavito
34

Musisz albo uruchomić "update-database" z konsoli menedżera pakietów, aby przesłać zmiany do bazy danych LUB możesz usunąć oczekujący plik migracji ([201203170856167_left]) z folderu Migracje, a następnie ponownie uruchomić "add-migrację" do utwórz zupełnie nową migrację na podstawie swoich zmian.

socketman
źródło
1
Usunąłem plik migracji i uruchomiłem migrację dodatków, ale nadal daje ten sam błąd.
nu everest
2
Dzięki, wskazówka dotycząca usunięcia oczekującego pliku migracji uratowała życie
Manish
31

Ten błąd może również oznaczać, że migracje nie są już rozpoznawane. Zdarzyło mi się to po zmianie wartości ContextKey w Migrations.Configuration. Rozwiązaniem było po prostu zaktualizowanie ContextKey w tabeli bazy danych „__MigrationHistory” (lub chyba przywrócenie wartości w klasie Configuration). ContextKey i Przestrzeń nazw w aplikacji powinny być zgodne.

Tomasz
źródło
1
To była właściwa odpowiedź w moim przypadku. Ponieważ użyłem jednego z moich starych projektów do nowego podobnego projektu, nie byłem w stanie wprowadzić zmian w bazie danych w ramach starych migracji. Jak zasugerował Thomas, przestrzeń nazw była inna w Migrations od Contextkey w tabeli _MigrationsHistory, co powodowało, że stare migracje nie były rozpoznawane.
Tarek Shawadfy
1
Pomogło mi to, ponieważ spowodowałem problem, zmieniając nazwę rozwiązania. W trakcie tego procesu zmieniłem nazwę ContextKey, więc nie pasował już do wpisów _MigrationHistory.
Joel
Pracowałem też dla mnie, ustawiłem jawny klucz kontekstowy w konfiguracji, zmieniłem go w __MigrationHistory i update-database zdecydował, że wszystko jest fajne. Dzięki!
James White
2
Śmieszne, ale słuszne. Jeśli zaktualizowałeś nazwę projektu lub podzieliłeś projekt (mój przypadek) na kilka i próbujesz dodać nową migrację z nowego projektu do tej samej bazy danych, musisz użyć prawidłowego ContextKey, możesz ustawić go w konstruktorze konfiguracji ( musisz użyć klucza kontekstowego, który masz w tabeli __MigrationHistory w docelowej
bazie danych
to samo tutaj,
zmieniłem
19

1. Parametry połączenia / Uprawnienia połączenia

Sprawdź ponownie parametry połączenia.

Upewnij się, że użytkownik, z którym się łączysz, nadal ma uprawnienia do odczytu [__MigrationHistory]i uprawnienia do edytowania schematu.

Możesz również spróbować zmienić parametry połączenia w pliku konfiguracyjnym aplikacji lub sieci Web, aby użyć zintegrowanych zabezpieczeń (Windows Auth) do uruchomienia polecenia add -igration jako siebie .

Na przykład:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Te parametry połączenia zostaną umieszczone w pliku App.config projektu, w którym znajduje się DbContext.

2. Projekt startowy

Można określić projektu StartUp w linii poleceń można też kliknąć prawym przyciskiem myszy projektu z DbContext, Configurationi migracje folder i wybierz Ustaw jako projektu Autostart . Mówię poważnie, to może faktycznie pomóc.

wprowadź opis obrazu tutaj

Pęto
źródło
Ha ha. Chciałbym, żeby przyniosło to więcej głosów. Zdarza mi się to często, a Integrated Securitypoprawka działa świetnie!
Jess
1
Miałem ten sam problem, żadne z poleceń migracji nie działało. Okazuje się, że przyczyną nie było ustawienie projektu startowego. Ustawienie to rozwiązało mój problem.
Vishal,
Zmiana projektu startowego zadziałała dla mnie! Byłem pewien, że to nie zadziała, ale i tak spróbowałem, ponieważ wszystko inne zawiodło. Świetna odpowiedź.
Sylvain Rodrigue
„Ustaw jako startowe” - nigdy bym nie zgadł! Dziękuję Ci!!
Jasel
1
Tak, celowo zmieniłem projekt startowy i zapomniałem go zmienić. Zabawne jest to, że jedna migracja wcześniej została wykonana z odpowiednim projektem startowym, więc wszystko działało dobrze. Ale to jest teraz logiczne - b / c EF pobiera parametry połączenia z projektu, więc "nie wie", że migracje faktycznie zostały już zastosowane do DB ...
kosist
8

Miałem ten sam problem i udało mi się rozwiązać z kilkoma wskazówkami z powyższych odpowiedzi:

  • W konsoli menedżera pakietów zaznacz projekt domyślny (wskaż projekt z konfiguracją migracji
  • Upewnij się, że startup-proj ma plik web.config z prawidłowym ciągiem połączenia (lub
  • Upewnij się, że projekt z migracjami ma plik app.config / web.config z prawidłowym ciągiem połączenia
  • Sprawdź uprawnienia w DB (dla użytkownika skonfigurowanego w twoim łańcuchu połączeń)

Użyj polecenia „update-database -verbose” w konsoli menedżera pakietów, aby uzyskać bardziej szczegółowe informacje, z którymi migracje próbują się połączyć. (Pomogłem w moim przypadku dowiedzieć się, że mój projekt startowy nie został poprawnie ustawiony ...)

zgiąć
źródło
2
uruchomiłem "update-database -verbose" i zauważyłem, że moje parametry połączenia są zepsute, lol. Tak więc polecenie add-migration podaje nieprawidłowy komunikat.
Wachburn
4
„Upewnij się, że start-proj {...}” rozwiązał mój problem. Dzięki @flex
Andy Schmitt
7

Podczas napotkania tego problemu spróbuj dodać parametry do polecenia cmdlet add -igration. Na przykład określenie projektu startowego oraz nazwy parametrów połączenia może pomóc EF w znalezieniu docelowej bazy danych.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Gdzie:

Delta_Defect_0973 to nazwa Twojej migracji

your.namespace.ContextClassName to nazwa klasy konfiguracji w folderze migracji, poprzedzona pełną przestrzenią nazw.

DeltaProject to nazwa twojego głównego projektu z plikiem web.config lub app.config.

DeltaSQL to nazwa ciągu połączenia zdefiniowanego w pliku web.config lub app.config.

Yves Rochon
źródło
Dzięki. To naprawdę mi pomogło.
Jess
Ponadto jeśli używasz iniekcji zależności w swoim rozwiązaniu, może być konieczne wybranie innego projektu domyślnego w konsoli Menedżera pakietów. Jeśli EF nie może zlokalizować migracji, spróbuj wybrać projekt, który faktycznie zawiera migracje jako projekt domyślny.
Yves Rochon,
5

Ten błąd oznacza, że ​​oczekujące migracje muszą zostać zatwierdzone, zanim będzie można wykonać kolejną jawną migrację. Możesz wybrać

  1. Wykonaj te oczekujące migracje za pomocą polecenia Update-Database
  2. Usuń te oczekujące migracje. Najbezpieczniejszym sposobem jest otwarcie folderu Migracje, kliknij prawym przyciskiem myszy [201203170856167_left]> Wyklucz z projektu

Po tym możesz ponownie uruchomić "Dodaj migrację ..."

Mam nadzieję, że to pomoże

Hung Vu
źródło
4

Tylko moje dwa centy:

Mój scenariusz:

  1. Przywróciłem moją lokalną bazę danych do stanu roboczego.
  2. Migracje zostały już zastosowane do niego.
  3. Za każdym razem, gdy próbowałem dodać nową migrację, otrzymywałem błąd dotyczący oczekujących migracji, jak wspomniano w moim OP.

Rozwiązanie:

Aby obejść ten problem, podałem bardziej szczegółowe parametry:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Jestem skłonny sądzić, że możesz ustawić ustawienie w folderze app.config, aby umożliwić domyślne ustawienie tego zachowania, dzięki czemu nie musisz za każdym razem podawać jawnych parametrów. Jednak nie jestem pewien, jak to zrobić.

IbrarMumtaz
źródło
1
To zadziałało dla mnie, właśnie dodałem nazwę migracji na końcu polecenia pokazanego powyżej.
sfors mówi, że przywróć Monikę
1
=) - cieszę się, że mogłem pomóc.
IbrarMumtaz
1
-ConnectionStringNamejest alternatywą dla tego i pobierze parametry połączenia z konfiguracji według nazwy
Simon_Weaver
1
Pomogło mi to, ponieważ nie przechowuję parametrów połączenia w pliku konfiguracyjnym
Sasinosoft
3

Jest niejasność, a więc błąd. Najlepszym sposobem jest wykluczenie bieżącego pliku migracji i utworzenie nowego pliku migracji ( dodawanie-migracja ), a następnie skopiowanie zawartości nowej migracji do wykluczonego pliku i ponowne jej dołączenie oraz uruchomienie polecenia update-database .

Sachin Cholkar
źródło
Po prostu uruchomiłem update-databasepolecenie, a następnie powtórzyłem add-migrationpolecenie i zadziałało
Smitty-Werben-Jager-Manjenson
3

rozwiązałem ten sam problem:

  • usuń stary plik migracji
  • update-database -force
  • Add-Migration AddedEntity
  • zaktualizować bazę danych
yilmazdincsoy
źródło
1

Miałem te same problemy i mogłem go rozwiązać tylko za pomocą Add-Migration 'MigrationName' -Force

Z-Force jest ważną częścią.

Evan Barke
źródło
1

W mojej lokalnej bazie danych nie ma __MigrationHistorywypełnionego lub istniejącego pliku. Ręcznie utworzyłem tabelę, a następnie przeprowadziłem migrację danych w tej tabeli z PROD do mojej lokalnej bazy danych. To spowodowało, że VS pomyślał, że migracje zostały zastosowane (a tak było).

contactmatt
źródło
Miałem ten sam problem, połączyłem moją żywą bazę danych z produkcją, ale dlatego historia migracji została utracona.
matthy
1

Wskazówka:-Script jeśli nie masz pewności , zawsze dobrze jest używać przełącznika do poleceń migracji. To również naprawdę pomaga zrozumieć, co Update-Databasetak naprawdę robi.

Uruchamiam następujące polecenie, aby zaktualizować bazę danych, a następnie otrzymuję skrypt, który mogę zastosować ręcznie (lub po prostu uruchom go ponownie bez tagu -Script).

Ponieważ Update-Databaseuruchomiłbym następujące:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Gdzie SQL_AzureLivejest nazwane parametry połączenia w mojej konfiguracji.

Następnie mogę sprawdzić, czy SQL wygląda prawidłowo, zastosować go i gotowe. Jak wielu innych powiedziało, jeśli parametry połączenia są nieprawidłowe lub nieprawidłowe, otrzymasz ten błąd.

Simon_Weaver
źródło
1

U mnie usunąłem plik migracji (w Twoim przypadku „201203170856167_left”) z Migrationsfolderu, a następnie uruchomiłem poniższe polecenie w konsoli Menedżera pakietów

Add-Migration <Parameter>
Update-Database
Surendra Mourya
źródło
0

Scenariusz

  • Pracuję w oddziale, w którym utworzyłem nową migrację DB.
  • Jestem gotowy do aktualizacji z mastera, ale master ma również niedawną migrację bazy danych.
  • Usuwam migrację db mojego oddziału, aby zapobiec konfliktom.
  • „Aktualizuj z poziomu głównego”.

Problem

Po aktualizacji z poziomu głównego uruchamiam „Add-Migration my_migration_name”, ale pojawia się następujący błąd:

Nie można wygenerować jawnej migracji, ponieważ oczekują następujące jawne migracje: [201607181944091_AddExternalEmailActivity]. Zastosuj oczekujące jawne migracje przed próbą wygenerowania nowej jawnej migracji.

Tak więc uruchamiam „Update-Database” i otrzymuję następujący błąd:

Nie można zaktualizować bazy danych w celu dopasowania do bieżącego modelu, ponieważ istnieją oczekujące zmiany i automatyczna migracja jest wyłączona

Rozwiązanie

W tym momencie ponowne uruchomienie „Add-Migration my_migration_name” rozwiązało mój problem. Moja teoria jest taka, że ​​uruchomienie „Update-Database” ma wszystko w takim stanie, w jakim było potrzebne, aby „Add-Migration” działało.

Tod Birdsall
źródło
0

Trafiłem też na ten problem. Pojawiło się, gdy utworzyłem nową bazę danych i miałem oczekujące zmiany dotyczące migracji bazy danych w pierwszej kolejności kodu, a następnie próbowałem uruchomić polecenie „Update-Database”. Rozwiązanie: uruchom polecenie „Add-Migration -MigrationName”, aby utworzyć nową migrację dla nowej bazy danych. Następnie uruchom polecenie „Update-Database”.

Pritam
źródło
0

Miałem ten problem również w przypadku bazy danych, o której wiedziałem, że jest aktualna podczas uruchamiania Add-Migration. Rozwiązany przez po prostu ponowne uruchomienie polecenia Add-Migration. Podejrzewam problem z łącznością, zgodnie z sugestią Robina Dorbella powyżej.

spadelives
źródło
W moim scenariuszu nazwa bazy danych była rozróżniana na wielkość liter podczas uruchamiania polecenia. gdy tylko utworzyłem
ciąg
0

Stało się tak, gdy nagle zmieniłem nazwę klasy starej migracji, która już istnieje w db. Sprawdziłem historię VCS, ustaliłem to i ponownie zmieniłem nazwę. Wszystko działało później.

Doktorze Coder
źródło
0

Zrobiłem w inny sposób. Porzuciłem bazę danych całkowicie i ponownie uruchomiłem "update-database" w vs.

Ghadir Farzaneh
źródło
Nie zapewnia to wykonalnej poprawki; poprawna migracja zachowuje istniejącą strukturę.
Ferdipux
0

Miałem prostszy problem. VS błędnie zgłosił ten błąd, gdy miałem połączenie VPN z witryną klienta połączoną z moją stacją roboczą. Problem polegał na tym, że zabezpieczenia DBMS były ustawione na akceptowanie żądań tylko z mojego prawdziwego lokalnego adresu IP. Samo wyłączenie VPN rozwiązało problem.

spadelives
źródło
0

W moim przypadku zapomniałem dodać mój adres IP w regułach zapory na Azure, ponieważ nie mogłem połączyć się z bazą danych, otrzymałem ten błąd. Dlatego specjalnie dla mojego przypadku dodałem mój adres IP w regułach zapory bazy danych na platformie Azure i wszystko działało dobrze. Poza tym może to być problem z proxy / połączeniem internetowym / nazwą użytkownika DB / ciągiem połączenia z bazą danych itp. LUB oczywiście możesz mieć oczekujące migracje, dla których musisz uruchomić polecenie Update-Database.

Siddharth Sachdeva
źródło
0

Historycznie zawsze rozwiązywałem ten problem, usuwając oczekujące migracje lub jeśli pozostał tylko 1 i było to najbardziej pożądane, używając -f do odtworzenia.

Ostatnio przestało to dla mnie działać.

Kiedy stało się to po raz pierwszy, ponownie uruchomiłem program Visual Studio, a następnie pozwoliłem mi kontynuować.

Za drugim razem zadziałało dopiero po przeprowadzeniu czyszczenia projektu. Wyglądało to prawie tak, jakby oczekujące migracje zostały zachowane pomimo usunięcia wszystkich plików z eksploratora.

Adam Marshall
źródło
0

To nie będzie odpowiedź dla wielu osób, ale EF wyrzuci ten błąd, gdy nie może połączyć się z DB. Jeśli pracujesz z domu tak jak ja, upewnij się, że nadal masz połączenie z VPN!

Kodowanie Kretyn
źródło
-1

Dokładnie ten sam problem miałem zaraz po powrocie z migracji na inną.

W moim przypadku „migracja docelowa” z „migracji06” do „migracji04”.

Musiałem usunąć „migrację0” 6, a następnie udało mi się wymusić utworzenie „migracji05”. Zasadniczo oznacza to, że musisz po prostu zachować następną migrację po migracji docelowej.

Gonzo345
źródło
-1

W moim przypadku (używając MS Visual Studio) było to tak proste, jak ponowne uruchomienie Visual Studio.

AGuyCalledGerald
źródło