Jak odtworzyć bazę danych dla Entity Framework?

143

Mam zły stan z moim projektem ASP.Net MVC 5 przy użyciu Code-First Entity Framework. Nie obchodzi mnie utrata danych, po prostu chcę móc zacząć od nowa, odtworzyć bazę danych i zacząć korzystać z migracji Code-First.

Obecnie jestem w stanie, w którym każda próba aktualizacji bazy danych powoduje zgłoszenie wyjątku lub otrzymanie komunikatu o błędzie. Witryna nie może również uzyskać prawidłowego dostępu do bazy danych. Jak mogę wyczyścić wszystkie migracje, ponownie utworzyć bazę danych i zacząć od zera bez konieczności tworzenia nowego projektu? Innymi słowy, chcę zachować mój kod, ale porzucić bazę danych.

Później będę chciał również zsynchronizować bazę danych wdrażania (SQL Server na platformie Azure). Ponownie, nie mam nic przeciwko porzuceniu wszystkich danych - chcę tylko, aby działały.

Podaj wszelkie instrukcje umożliwiające przywrócenie czystości. Bardzo cenione.

Toby Sharp
źródło
TBH, jeśli po prostu chcesz DROP DATABASE...
Worthy7

Odpowiedzi:

209

Wykonaj poniższe kroki:

1) Najpierw przejdź do Eksploratora serwera w programie Visual Studio, sprawdź, czy połączenia danych „.mdf” dla tego projektu są połączone. Jeśli tak, kliknij prawym przyciskiem myszy i usuń.

2) Przejdź do Eksploratora rozwiązań, kliknij ikonę Pokaż wszystkie pliki.

3) Przejdź do App_Data, kliknij prawym przyciskiem myszy i usuń wszystkie pliki „.mdf” dla tego projektu.

4) Usuń folder migracji, klikając prawym przyciskiem myszy i usuń.

5) Przejdź do SQL Server Management Studio, upewnij się, że nie ma bazy danych dla tego projektu, w przeciwnym razie usuń ją.

6) Przejdź do konsoli Menedżera pakietów w programie Visual Studio i wpisz:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Uruchom aplikację

Uwaga: jeśli w kroku 6, część 3, pojawi się błąd „Nie można dołączyć pliku ...”, prawdopodobnie oznacza to, że pliki bazy danych nie zostały całkowicie usunięte w programie SQL Server.

Lin
źródło
Doskonały! To zadziałało, dziękuję! Rzeczywiście bardzo pomocne. Czy kroki są podobne do ponownego tworzenia bazy danych wdrożenia (Azure SQL)?
Toby Sharp
cześć @TobySharp, żadnych problemów. Jeśli nie masz żadnych danych w swojej bazie danych, możesz wykonać następujące kroki, ale jeśli masz dane, kroki nie są takie same.
Lin
Nie mam żadnych danych, które muszę zachować.
Toby Sharp
3
Zaktualizuj, jeśli usuniesz z VS (zgodnie z instrukcjami), a nie z Eksploratora Windows, to działa. Ponadto, jeśli nie masz programu SQL Management Studio, możesz użyć Sql Object Explorer w programie VS, aby usunąć z localdb.
Mike Ward
3
Jeśli pojawia się błąd „Nie można dołączyć pliku ...”, mimo że sądzisz, że wszystko zostało usunięte, wypróbuj odpowiedź z tego wątku: stackoverflow.com/questions/13275054/ ...
Andy,
44

Chciałbym dodać, że odpowiedź Lin jest poprawna.

Jeśli nieprawidłowo usuniesz MDF, będziesz musiał to naprawić. Do mocowania połączeń śrubowych w projekcie do płyty MDF. Krótka odpowiedź; odtworzyć i usunąć poprawnie.

  1. Utwórz nowy MDF i nazwij go tak samo jak stary MDF, umieść go w tej samej lokalizacji folderu. Możesz utworzyć nowy projekt i utworzyć nowy plik mdf. Plik mdf nie musi pasować do starych tabel, ponieważ zamierzaliśmy go usunąć. Więc utwórz lub skopiuj stary do właściwego folderu.
  2. Otwórz go w eksploratorze serwera [kliknij dwukrotnie plik mdf w eksploratorze rozwiązań]
  3. Usuń go w eksploratorze serwera
  4. Usuń go z eksploratora rozwiązań
  5. uruchom update-database -force [użyj siły, jeśli to konieczne]

Gotowe, ciesz się nową bazą danych

UPDATE 11/12/14 - używam tego cały czas, kiedy dokonuję zrywającej zmiany db. Odkryłem, że to świetny sposób na przywrócenie migracji do oryginalnej bazy danych:

  • Przywraca db z powrotem do oryginału
  • Uruchom normalną migrację, aby przywrócić bieżącą wersję

    1. Update-Database -TargetMigration:0 -force [Spowoduje to zniszczenie wszystkich tabel i wszystkich danych.]
    2. Update-Database -force [w razie potrzeby użyj siły]
Steve Coleman
źródło
1
Cieszę się, że mogłem pomóc ... Zaktualizuję swoją odpowiedź. Niedawno znalazłem lepszy sposób na wycofanie wszystkich zmian.
Steve Coleman
8

To zadziałało dla mnie:

  1. Usuń bazę danych z Eksploratora obiektów SQL Server w programie Visual Studio. Kliknij prawym przyciskiem myszy i wybierz usuń.
  2. Usuń pliki mdf i ldf z systemu plików - jeśli nadal tam są.
  3. Odbuduj rozwiązanie.
  4. Uruchom aplikację - baza danych zostanie odtworzona.
Donal
źródło
1
Tak, wszystko, co musiałem zrobić, to usunąć MDF, zaktualizować parametry połączenia w web.config, a następnie uruchomić aplikację i zarejestrować nowe konto. Automatycznie utworzył wszystkie tabele w nowej bazie danych.
Dan Bechard
3

Chociaż podstawą tego pytania jest brak dbałości o dane, czasami utrzymanie danych jest niezbędne.

Jeśli tak, napisałem listę kroków, jak odzyskać z koszmaru Entity Framework, gdy baza danych ma już tabele o tej samej nazwie tutaj: Jak odzyskać z koszmaru Entity Framework - baza danych ma już tabele o tej samej nazwie

Najwyraźniej ... moderator uznał za stosowne usunąć mój post, więc wkleię go tutaj:

Jak odzyskać od koszmaru Entity Framework - baza danych ma już tabele o tej samej nazwie

Opis : Jeśli jesteś podobny do nas, gdy Twój zespół jest nowy w EF, skończysz w stanie, w którym albo nie możesz utworzyć nowej lokalnej bazy danych, albo nie możesz zastosować aktualizacji do swojej produkcyjnej bazy danych. Chcesz wrócić do czystego środowiska EF, a następnie trzymać się podstaw, ale nie możesz. Jeśli sprawisz, że będzie działać w środowisku produkcyjnym, nie możesz utworzyć lokalnej bazy danych, a jeśli zaczniesz działać lokalnie, serwer produkcyjny nie będzie zsynchronizowany. I wreszcie, nie chcesz usuwać żadnych danych serwera produkcyjnego.

Objaw : nie można uruchomić Update-Database, ponieważ próbuje uruchomić skrypt tworzenia, a baza danych zawiera już tabele o tej samej nazwie.

Komunikat o błędzie: System.Data.SqlClient.SqlException (0x80131904): W bazie danych istnieje już obiekt o nazwie „”.

Tło problemu : EF rozumie, gdzie znajduje się bieżąca baza danych w porównaniu z miejscem, w którym znajduje się kod, na podstawie tabeli w bazie danych o nazwie dbo .__ MigrationHistory. Kiedy patrzy na skrypty migracji, próbuje ponownie porównać ze skryptami, gdzie było ostatnio. Jeśli nie może, po prostu próbuje zastosować je po kolei. Oznacza to, że wraca do początkowego skryptu tworzenia i jeśli spojrzysz na pierwszą część polecenia UP, będzie to CreeateTable dla tabeli, w której wystąpił błąd.

Aby lepiej to zrozumieć, polecam obejrzenie obu filmów wymienionych tutaj: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Rozwiązanie : Musimy nakłonić EF do myślenia, że ​​bieżąca baza danych jest aktualna, ale nie stosujemy tych poleceń CreateTable. Jednocześnie nadal chcemy, aby te polecenia istniały, abyśmy mogli tworzyć nowe lokalne bazy danych.

Krok 1: Oczyszczanie produkcyjnej bazy danych Najpierw wykonaj kopię zapasową produkcyjnej bazy danych. W programie SSMS kliknij prawym przyciskiem myszy bazę danych, wybierz „Zadania> Eksportuj aplikację warstwy danych ...” i postępuj zgodnie z wyświetlanymi instrukcjami. Otwórz produkcyjną bazę danych i usuń / upuść tabelę dbo .__ MigrationHistory.

Krok 2: Czyszczenie środowiska lokalnego Otwórz folder migracji i usuń go. Zakładam, że w razie potrzeby możesz odzyskać to wszystko z gita.

Krok 3: Ponownie utwórz początkowe W Menedżerze pakietów uruchom „Enable-Migrations” (EF wyświetli monit o użycie -ContextTypeName, jeśli masz wiele kontekstów). Uruchom „Add-Migration Initial -verbose”. Spowoduje to utworzenie początkowego skryptu do utworzenia bazy danych od podstaw na podstawie bieżącego kodu. Jeśli w poprzednim pliku Configuration.cs były jakieś operacje inicjujące, skopiuj je.

Krok 4: Trick EF W tym momencie, gdybyśmy uruchomili Update-Database , otrzymalibyśmy oryginalny błąd. Musimy więc oszukać EF, aby pomyślał, że jest aktualny, bez uruchamiania tych poleceń. Więc przejdź do metody Up w utworzonej migracji początkowej i skomentuj ją.

Krok 5: Aktualizacja bazy danych Bez kodu do wykonania w procesie Up, EF utworzy tabelę dbo .__ MigrationHistory z poprawnym wpisem, aby powiedzieć, że poprawnie uruchomił ten skrypt. Idź i sprawdź to, jeśli chcesz. Teraz odkomentuj ten kod i zapisz. Możesz ponownie uruchomić Update-Database, jeśli chcesz sprawdzić, czy EF uważa, że ​​jest aktualny. Nie uruchomi kroku Up ze wszystkimi poleceniami CreateTable, ponieważ uważa, że ​​już to zrobił.

Krok 6: Potwierdź, że EF jest AKTUALNIE aktualny Jeśli masz kod, do którego jeszcze nie zastosowano migracji, oto co zrobiłem ...

Uruchom „Add-Migration MissingMigrations” Spowoduje to utworzenie praktycznie pustego skryptu. Ponieważ kod już tam był, w rzeczywistości istniały poprawne polecenia do tworzenia tych tabel w początkowym skrypcie migracji, więc po prostu wyciąłem CreateTable i równoważne polecenia drop do metod Up i Down.

Teraz uruchom ponownie Update-Database i obserwuj, jak wykonuje nowy skrypt migracji, tworząc odpowiednie tabele w bazie danych.

Krok 7: Potwierdź ponownie i zatwierdź. Buduj, testuj, uruchamiaj. Upewnij się, że wszystko działa, a następnie zatwierdź zmiany.

Krok 8: Poinformuj resztę swojego zespołu, jak postępować. Kiedy następna osoba zaktualizuje się, EF nie będzie wiedział, co go uderzyło, biorąc pod uwagę, że skrypty, które uruchomił wcześniej, nie istnieją. Ale zakładając, że lokalne bazy danych można zdmuchnąć i ponownie utworzyć, wszystko jest w porządku. Będą musieli porzucić lokalną bazę danych i ponownie dodać opcję Utwórz ją z EF. Jeśli mieli lokalne zmiany i oczekujące migracje, zaleciłbym, aby ponownie utworzyli bazę danych na serwerze głównym, przełączyli się na gałąź funkcji i ponownie utworzyli skrypty migracji od podstaw.

System.Exception
źródło
1

Chcę tylko dodać do doskonałej odpowiedzi @Lin:

5) B. Jeśli nie masz programu SQL Management Studio, przejdź do „Eksploratora obiektów SQL Server”. Jeśli nie widzisz bazy danych projektu w localdb „SQL Server Object Explorer”, kliknij przycisk „Dodaj serwer SQL”, aby dodać go do listy ręcznie. Następnie możesz usunąć bazę danych z listy.

Dudi
źródło
Jeśli chcesz coś dodać do odpowiedzi, dodaj komentarz do tej odpowiedzi, zamiast publikować nową odpowiedź.
Oliver
1
Nie byłem tego świadomy. Więc teraz możesz przenieść swoją odpowiedź do komentarza i usunąć tę odpowiedź, ponieważ technicznie nie jest to (pełna) odpowiedź na pytanie :-)
Oliver
0

Możliwa bardzo prosta poprawka, która zadziałała dla mnie. Po usunięciu wszelkich odniesień do bazy danych i połączeń, które znajdziesz w eksploratorze server / serverobject, kliknij prawym przyciskiem myszy folder App_Data (nie pokazałem żadnych obiektów w aplikacji) i wybierz Otwórz. Po otwarciu umieść całą bazę danych / etc. pliki w folderze kopii zapasowej lub jeśli masz odwagę, po prostu je usuń. Uruchom aplikację i powinna odtworzyć wszystko od zera.

edencorbin
źródło
0

Moje rozwiązanie najlepiej nadaje się do :
- usunięcia pliku mdf
- chęci odtworzenia bazy danych.

Aby odtworzyć bazę danych , musisz dodać połączenie za pomocą programu Visual Studio.

Krok 1 : Przejdź do Eksploratora serwera i dodaj nowe połączenie (lub poszukaj ikony dodawania bazy danych).

Krok 2 : Zmień DataSource do Microsoft SQL Server Database File .

Krok 3 : dodaj dowolną nazwę bazy danych w polu Nazwa pliku bazy danych . (Najlepiej taką samą nazwę, jaką masz w atrybucie web.config AttachDbFilename )

Krok 4 : kliknij Przeglądaj i przejdź do miejsca, w którym chcesz, aby się znajdował.

Krok 5 : w poleceniu uruchamiania konsoli menedżera pakietówupdate-database

Mbuso Mkhize
źródło