Jak włączyć migracje Entity Framework 5 (wersja 5.0.0) dla wielu kontekstów bazy danych w tym samym projekcie, gdzie każdy kontekst odpowiada własnej bazie danych? Kiedy uruchamiam Enable-Migrations
w konsoli PM (Visual Studio 2012), pojawia się błąd z powodu wielu kontekstów:
PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.
Jeśli uruchomię, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
nie mogę uruchomić, Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
ponieważ migracja już istnieje:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Odpowiedzi:
Drugie wywołanie Enable-Migrations kończy się niepowodzeniem, ponieważ plik Configuration.cs już istnieje. Jeśli zmienisz nazwę tej klasy i pliku, powinieneś być w stanie uruchomić drugą opcję Enable-Migrations, która utworzy kolejny plik Configuration.cs.
Będziesz wtedy musiał określić, której konfiguracji chcesz użyć podczas aktualizacji baz danych.
źródło
Oprócz tego, co @ckal zasugerował, że jest krytyczna aby każdy przemianowany Configuration.cs własną przestrzeń nazw. Jeśli tego nie zrobisz, EF spróbuje zastosować migracje do niewłaściwego kontekstu.
Oto konkretne kroki, które dobrze mi odpowiadają.
Jeśli migracje są pomieszane i chcesz utworzyć nową „linię bazową”:
Tworzenie migracji początkowej:
W konsoli Menedżera pakietów:
W Eksploratorze rozwiązań: Zmień nazwę Migrations.Configuration.cs na Migrations.ConfigurationA.cs. Powinno to automatycznie zmienić nazwę konstruktora, jeśli używasz programu Visual Studio. Upewnij się, że tak. Edytuj ConfigurationA.cs: Zmień przestrzeń nazw na NamespaceOfContext.Migrations.MigrationsA
W Eksploratorze rozwiązań: Zmień nazwę Migrations.Configuration.cs na Migrations.ConfigurationB.cs. Ponownie upewnij się, że nazwa konstruktora również została odpowiednio zmieniona. Edytuj ConfigurationB.cs: Zmień przestrzeń nazw na NamespaceOfContext.Migrations.MigrationsB
Kroki tworzenia skryptów migracji w konsoli Menedżera pakietów:
Uruchom polecenie
lub -
Można ponownie uruchomić to polecenie, dopóki zmiany nie zostaną zastosowane w bazie danych.
Albo uruchom skrypty dla żądanej lokalnej bazy danych lub uruchom Update-Database bez -Script, aby zastosować lokalnie:
lub -
źródło
Właśnie natknąłem się na ten sam problem i użyłem następującego rozwiązania (wszystko z konsoli Menedżera pakietów)
Spowoduje to utworzenie 2 oddzielnych folderów w folderze Migracje. Każdy będzie zawierał wygenerowany
Configuration.cs
plik. Niestety nadal musisz zmienić nazwy tychConfiguration.cs
plików, w przeciwnym razie pojawią się skargi dotyczące posiadania dwóch z nich. Zmieniłem nazwy moich plików naConfigA.cs
iConfigB.cs
EDYTUJ : (dzięki uprzejmości Kevina McPheata) Pamiętaj, zmieniając nazwy plików Configuration.cs, zmień także nazwy klas i konstruktorów / EDYCJA
Dzięki tej strukturze możesz po prostu to zrobić
Który utworzy pliki kodu do migracji w folderze obok plików konfiguracyjnych (dobrze jest trzymać te pliki razem)
I wreszcie, te dwa polecenia zastosują poprawne migracje do odpowiednich baz danych.
EDYCJA 08 lutego 2016: Przeprowadziłem małe testy z EF7 w wersji 7.0.0-rc1-16348
Nie mogłem zmusić opcji -o | --outputDir do działania. Nadal dawał
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Wygląda jednak na to, że po dodaniu migracji po raz pierwszy jest ona dodawana do folderu Migrations, a kolejna migracja do innego kontekstu jest automatycznie umieszczana w podfolderze migracji.
ContextA
Wydaje się, że oryginalne nazwy naruszają niektóre konwencje nazewnictwa, więc używam terazContextAContext
iContextBContext
. Używając tych nazw, możesz użyć następujących poleceń: (zwróć uwagę, że mój dnx nadal działa z konsoli menedżera pakietów i nie lubię otwierać osobnego okna CMD do wykonywania migracji)Spowoduje to utworzenie migawki modelu i początkowej migracji w
Migrations
folderze dlaContextAContext
. Utworzy folder o nazwieContextB
zawierający te pliki dlaContextBContext
Ręcznie dodałem
ContextA
folder i przeniosłem pliki migracji zContextAContext
do tego folderu. Następnie zmieniłem nazwę przestrzeni nazw w tych plikach (plik migawki, początkowa migracja i zauważam, że pod początkowym plikiem migracji znajduje się trzeci plik ... designer.cs). Musiałem dodać coś do.ContextA
przestrzeni nazw, a stamtąd framework ponownie obsługuje to automatycznie.Użycie poniższych poleceń spowodowałoby utworzenie nowej migracji dla każdego kontekstu
a wygenerowane pliki są umieszczane w odpowiednich folderach.
źródło
add-migration
wyświetli monit o podanieName
. To mnie trochę zrzuciło, ponieważ już dostarczałemConfigurationTypeName
i byłem nieco zirytowany, kiedy to właśnie powiedziałName:
. Ale oczywiście nazwa, której chce, to „czytelny dla człowieka” opis zmiany - np.AddedProducts
lubIncreaseLengthOfNameFields
. W folderze Migracje otrzymasz to jako część nazwy klasy, aby łatwo było zobaczyć, co to jest. W efekcieName
przypomina to komentarz do zameldowania.Jeśli masz już „Konfiguracja” z wieloma migracjami i chcesz ją zachować bez zmian, zawsze możesz utworzyć nową klasę „Konfiguracja”, nadać jej inną nazwę, na przykład
następnie po prostu wydaj polecenie
a EF zorganizuje migrację bez problemów. Na koniec zaktualizuj swoją bazę danych, od teraz EF będzie narzekać, jeśli nie powiesz mu, którą konfigurację chcesz zaktualizować:
Gotowe.
Nie musisz zajmować się Enable-Migrations, ponieważ będzie narzekać, że „Konfiguracja” już istnieje, a zmiana nazwy istniejącej klasy konfiguracji spowoduje pojawienie się problemów w historii migracji.
Możesz kierować reklamy na różne bazy danych lub tę samą, wszystkie konfiguracje będą dobrze współdzielić tabelę __MigrationHistory.
źródło
Aby zaktualizować typ bazy danych, korzystając z kodów w programie PowerShell ...
* jeśli istnieje więcej niż jedna baza danych, użyj tylko tego kodu, w innym przypadku nie jest to konieczne.
źródło
Jeśli istnieje więcej baz danych, użyj następujących kodów w programie PowerShell
„Starter” to nazwa migracji
„EnrollmentAppContext” to nazwa kontekstu mojej aplikacji
Możesz otworzyć PowerShell w VS, wykonując:
Tools->NuGet Package Manager->Package Manager Console
źródło
EF 4,7 faktycznie daje wskazówkę podczas uruchamiania migracji włączania w wielu kontekstach.
W zestawie „Service.Domain” znaleziono więcej niż jeden typ kontekstu.
źródło