2013-10-02 7 views
19

Mam do czynienia z dziwnym problemem z pierwszymi migracjami kodu w Entity Framework w wersji 5. Czasami Update-Database kończy się niepowodzeniem z powodu oczekujących zmian, ale komenda Add-Migration powoduje tylko migracje z zmianami bazy danych już zawartymi w ostatnich migracjach, a baza danych jest aktualna. Dlatego spodziewam się, że nowa migracja będzie pusta.Dlaczego usługa Add-Migration tworzy czasami zduplikowane migracje?

W jaki sposób wykrywa, jakie zmiany są należne? Wydaje się, że nie używa bazy danych jako źródła.

Odpowiedz

35

Migawka modelu bazy danych jest zapisywana wraz z każdą migracją w pliku .resx. Po dodaniu nowej migracji EF porównuje bieżący model bazy danych (wygenerowany na podstawie klas i ustawień modelu z DbModelBuilder) z ostatnią migracją i określa zmiany między nimi.

Opisywany problem może wystąpić, jeśli migracja nie jest zsynchronizowana. Zdarza się to, jeśli dwaj deweloperzy wykonają dwie niezależne migracje, a te migracje zostaną później połączone z domyślną gałęzią.

przykład:

Twórca 1

migracji AddColumnA

Twórca 2

migracji AddColumnB

wersja Scalony

Migracja AddColumnA - migawka bazy danych zawiera Columna

Migracja AddColumnB - migawka bazy danych zawiera columnB ale nie Columna

Jeśli dodać kolejną migrację, zmiany są ustalane przed migracją AddColumnB, nie zawiera informacji o kolumnie A. Rozwiązaniem tego problemu jest generowanie migracji manekinowej (z pustymi metodami Up i Down), aby uzyskać poprawną migawkę modelu bazy danych podczas ostatniej migracji.

wersja Połączony

Migracja AddColumnA - migawka bazy danych zawiera Columna

Migracja AddColumnB - migawka bazy danych zawiera columnB ale nie Columna

Migracja Dummy - migawka bazy danych z kręgosłupa i columnB

+1

Bardzo ciekawy. Czy istnieje sposób, aby zapobiec tworzeniu migracji na podstawie tego pliku zasobów, aby baza danych była używana jako odniesienie? Jest to poważna wada migracji, moim zdaniem, ponieważ naprawdę chcę mieć pliki migracji EXPLICIT zamiast tylko automatycznej migracji, ale nie chcę mieć wielu fałszywych plików migracyjnych podczas pracy z wieloma programistami w tej samej bazie kodu. –

+2

IMHO nie ma sposobu, aby określić bazę danych jako odniesienie.Zamiast tworzyć sztuczną migrację, można przeprowadzić aktualizację do pierwszej migracji (AddColumnA), a następnie ponownie wygenerować drugą migrację. Metody "w górę" i "w dół" pozostaną takie same, ale migawka bazy danych zostanie zaktualizowana do odpowiedniej wersji, a migracja typu "dummy" nie będzie konieczna. –

+0

Dzięki za wszystkie informacje, ale przełączanie między wersjami dla każdego scalania jest o wiele bardziej kłopotliwe niż posiadanie "brzydkich"/pustych plików migracyjnych. Przynajmniej jeśli wykonasz jeden lub więcej scaleń każdego dnia. –