2013-10-01 14 views
13

Mam kilka tabel, które zostały utworzone przez Code First.Jak najpierw wymusić kod EF, aby odtworzyć bazy danych?

Następnie w SQL usunąłem jedną tabelę, aby nieuchronnie zadać to pytanie na stosie.

Po użyciu update-database w konsoli zarządzania pakietami uzyskać:

Nie można znaleźć obiektu „dbo.ContractParents”, ponieważ nie istnieje lub nie masz uprawnień.

Jaki jest najlepszy sposób na odtworzenie mojego stołu?

Czytałem się o context.Database.CreateIfNotExists();

I umieścić go w mojej funkcji nasion, ale nic nie robi.

Dzięki!

+3

Migracje nie naprawią uszkodzonej bazy danych. Przenosi bazę danych ze znanego stanu do nowego znanego stanu. Będziesz musiał odtworzyć tabelę ręcznie lub utworzyć zupełnie nową bazę danych. –

Odpowiedz

10

Aby wyjaśnić, co dzieje się z polecenia swojej update-bazy i dlaczego metoda w nasieniu context.Database.CreateIfNotExists() nie działa:

Po uruchomieniu polecenia update-bazy najpierw patrzy na ciągu połączenia, aby sprawdzić, czy baza danych jest tu. Jeśli tak, to przegląda tabelę historii migracji i sprawdza, czy klasa jest w tobie DbContext. Jeśli zauważy, że brakuje tabel lub zmian, spróbuje zaktualizować bazę danych. Metoda Seed nie jest wywoływana, dopóki nie zostanie wykonana, dlatego to nie zadziałało.

Podczas pracy z kodowaniem EF Najpierw zazwyczaj podchodzę do problemu na kilka różnych sposobów w zależności od wielkości bazy danych. Zwykle wybrałem trasę usuwania wszystkich tabel (łącznie z tabelą historii migracji), a następnie ponownie uruchomiłem komendę update-database. Działa dobrze, po prostu naprawdę czasochłonne, jeśli masz dużo tabel z wieloma ograniczeniami FK.

W końcu się zmęczyłem i znalazłem these scripts, aby upuścić stoły wykładniczo szybciej. Poszedłem do tego, ponieważ korzystałem z mojej aplikacji na platformie Azure. Gdy uruchomię go na moim komputerze lokalnym, po prostu usunę całą bazę danych i utworzę zupełnie nową bazę danych o tej samej nazwie.

Eleganckie rozwiązanie? Nie. Czy to działa? Bardziej lub mniej ...

+0

+1 Dzięki za opracowanie. – Pinch

4

Dla szybkiego i brudne podejścia, że ​​będziemy cię do domu na obiad w czasie wraz z dużą ilością dataloss (jestem jeszcze w fazie beta testów przy użyciu danych)

upuść tabeli systemowej dbo .__ MigrationHistory

wraz ze wszystkimi Twoimi innymi stołami.

Najpierw najpierw wykonaj kopię zapasową danych!

update-database -verbose (może trzeba trochę sosu ze swoimi spaghetti)

nie jestem pod wrażeniem, ale to działa.

Mam nadzieję, że ktoś wymyśli lepszą odpowiedź w przyszłości.

Pomoże to w lepszym zrozumieniu migracji.

+1

Kilka dobrych wskazówek tutaj: http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/ – Colin

+0

@Colin Dzięki za napiwek! – Pinch

+0

Dla samego zapisu '__MigrationHistory' nie jest tabelą systemową, tylko zwykłą tabelą z prefiksem. – MEMark

6

Na jeszcze innej opcji serowy ...

Kliknij prawym przyciskiem myszy na db serwer Explorer i uderzył usuwać Następnie można zrobić

Enable-Migrations -EnableAutomaticMigrations -Force 

Update-Database -Force 

Brudny aktualizację, czyste wynik :)

Powiązane problemy