2012-06-11 18 views
6

Najpierw jestem nowy w kodzie EF. Mam już istniejącą bazę danych w produkcji i najpierw użyłem kodu EF 4.3.1 i wszystko działało. Teraz tylko zaktualizowane moje schematu bazy danych i got wyjątekCo jest najprostszą rzeczą do zrobienia, gdy schemat bazy danych został zmieniony przy użyciu kodu EF najpierw

System.InvalidOperationException: The model backing the 'MyDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269). 

Nie mogę korzystać DropCreateDatabaseIfModelChanges ponieważ jest w produkcji, co jest najprostszym sposobem, aby podjąć, aby poradzić sobie ze zmianą schematu?

Dziękuję.

+1

Czy próbowałeś co sugeruje komunikat wyjątek? _Rozważ, używając Code First Migrations, aby zaktualizować bazę danych (http://go.microsoft.com/fwlink/?LinkId=238269)._ – jrummell

+0

Nie rozumiem, masz (posiadała) istniejącą bazę danych i użyłeś kodu pierwszy!? Załóżmy, że najpierw użyłeś kodu i utworzyłeś bazę danych z takim podejściem, a następnie zmień swój model jednostki i zaktualizuj odpowiednio bazę danych. Opis twojego scenariusza to a) źle lub b) jakoś dziwnie. –

+1

@YoupTube jest bardziej powszechne niż mogłoby się wydawać "reverse engineering" i istniejąca baza danych z kodem-pierwszym. Jest znacznie bardziej elastyczny niż przy użyciu pierwszego modelu projektanta bazy danych. – jrummell

Odpowiedz

6

Od migracji EF-CF są dość nowa koncepcja Sugerowałbym biorąc sprawdzony proces odwieczne i modyfikowanie go do pracy z naszymi nowymi narzędziami, jak EF. Oto, co robimy:

  1. Korzystając DropCreateDatabaseIfModelChanges dla rozwoju lokalnego. Umożliwi to zachowanie synchronizacji lokalnej kopii dewelopera z modelem (w kodzie). Za każdym razem, gdy budujesz/uruchamiasz, otrzymujesz zaktualizowaną lokalną bazę danych. Możesz również użyć inicjalizatora do załadowania danych testowych, itp. Database.SetInitializer<DBContextNameHere>(new DBContextInitializerNameHere());

  2. Skorzystaj z narzędzia SQLCompare RedGate, aby porównać lokalne narzędzie do produkcji i automatycznie wygenerować skrypt zmiany do wdrożenia. (Uwaga: można również automatycznie wdrożyć od narzędzia)

http://www.red-gate.com/products/sql-development/sql-compare/index-b

Kluczową korzyścią jest to, że nie trzeba zmieniać swój lokalny proces dev i uzyskać powtarzalne i wersjonowany upowszechnienia poprzez wygenerowany skrypt. Możesz także połączyć to z ich narzędziem kontroli źródła SQL, aby zachować wszystkie obiekty SQL i skrypty wdrażania (nawet dane) w kontroli źródła.

NIE, NIE pracuję dla tych facetów, uwielbiam ich narzędzie i to, jak pomogło mi to z tym samym problemem.

-1

Mam nadzieję, że ten kod pomocy pełną wam

EF- Code first migration

+0

Podczas gdy łącze może odpowiedzieć na pytanie, byłoby lepiej, jeśli możesz dodać nieco więcej szczegółów w odpowiedzi również tutaj. W ten sposób upewnisz się, że twoja odpowiedź pozostaje ważna, nawet jeśli link stanie się nieaktywny. – Harry

3

I odkryli, że uruchamiając następujący skrypt

truncate table __MigrationHistory 

na bazie usuwa ten problem, gdy kod/db stanie z synchronizacja.

Może po prostu przyzwyczaiłem się do starej szkoły, zbudowałem drukarnię z projektem bazy danych, odpowiednio zmodyfikowałem kod lub odkryłem, że potrzebuję nowego pola podczas kodowania itp. ... po prostu dodaj w obu miejscach.

Przyznam się do bycia nowym (ish) do MVC, ale czasami tego rodzaju funkcje są niepomocne, ponieważ ukrywają, jak rzeczy działają na podstawowym poziomie. Kiedy zrozumiesz, jak wszystko pasuje do siebie, wszystko co dobre, aby mieć generatory i narzędzia, które pomogą ci, ale kiedy zaczynasz ... Nie sądzę, że to jest dobre.

Natknąłem się na wielu programistów, którzy nie rozumieją prostych pojęć z powodu korzystania z generatorów kodu, kreatorów itp.jeśli chodzi o programowanie dla prawdziwych lub utrzymanie starszych systemów, to są one nieco zagubione.

+0

Zrobiłem "brudny" zapis, który spowodował, że EF dodał tę tabelę. Usunięcie go naprawiło mój problem. Dzięki! –

0

Kiedy to się dzieje, normalnie uruchamiam migrację, aby wskazać nową bazę danych, po utworzeniu tej bazy danych porównaj strukturę nowy z istniejącym, w razie potrzeby wprowadź zmiany ręcznie (w przeciwnym razie może wskazać przyczynę błędu - niezamierzoną zmianę schematu lub indeks itp.), a następnie usuń wpisy z tabeli __MigrationHistory na oryginalnym pliku db i skopiuj wpisy w poprzek nowej bazy danych, aby zmienna __MigrationHistory stała się prawidłowa, a kod First będzie teraz poprawnie zsynchronizowany.

0

I rozwiązany ten problem dodając

Database.SetInitializer<MyContext>(null); to Application_Start() inside Global.asax.cs 
Powiązane problemy