Jak włączyć migracje EF dla wielu kontekstów do oddzielania baz danych?
Jak włączyć migracje Entity Framework 5 (Wersja 5.0.0) Dla wielu kontekstów DB 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 istnienia 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 uruchamiam 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.
7 answers
Drugie wywołanie Enable-Migrations nie powiodło się, ponieważ konfiguracja.plik cs już istnieje. Jeśli zmienisz nazwę tej klasy I pliku, powinieneś być w stanie uruchomić drugi Enable-Migrations, który utworzy inną konfigurację.cs.
Następnie musisz określić konfigurację, której chcesz użyć podczas aktualizacji baz danych.
Update-Database -ConfigurationTypeName MyRenamedConfiguration
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-20 16:08:39
Oprócz tego, co zasugerował @ckal, jest krytyczne , aby podać każdą zmienioną konfigurację.cs ma własną przestrzeń nazw. Jeśli tego nie zrobisz, EF spróbuje zastosować migracje do niewłaściwego kontekstu.
Oto konkretne kroki, które działają dobrze dla mnie.
Jeśli migracje są popsute i chcesz utworzyć nową "linię bazową":
- Usuń istniejące .pliki cs w folderze migracje
- w SSMS Usuń system _ _ MigrationHistory stolik.
Tworzenie migracji początkowej:
-
W Konsoli Menedżera Pakietów:
Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
-
W Eksploratorze Rozwiązań: Zmień Nazwę Migracji.Konfiguracja.cs do migracji.Konfiguracja.cs. Powinno to automatycznie zmienić nazwę konstruktora, jeśli używasz Visual Studio. Upewnij się, że tak będzie. Edytuj Konfiguracjęa.cs: Zmień przestrzeń nazw na NamespaceOfContext.Migracje.MigrationsA
Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
-
W Eksploratorze Rozwiązań: Zmień Nazwę Migracje.Konfiguracja.cs do migracji.Konfiguracja B.cs. Ponownie, upewnij się, że konstruktor jest również odpowiednio przemianowany. Edytuj Konfiguracjęb.cs: Zmień przestrzeń nazw na NamespaceOfContext.Migracje.MigrationsB
add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
Update-Database -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
Update-Database -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
Kroki tworzenia skryptów migracji w konsoli Menedżera pakietów:
-
Uruchom polecenie
Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
Lub -
Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
Jest OK, aby ponownie uruchomić to polecenie, aż zmiany są stosowane do DB.
-
Albo uruchom skrypty z żądaną lokalną bazą danych, albo uruchom Update-Database without-Script, aby zastosować lokalnie:
Update-Database -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
Lub -
Update-Database -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 03:38:43
Właśnie natknąłem się na ten sam problem i użyłem następującego rozwiązania (wszystkie z konsoli Menedżera pakietów)
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB
Spowoduje utworzenie 2 oddzielnych folderów w folderze migracje. Każdy będzie zawierał wygenerowany plik Configuration.cs
. Niestety nadal musisz zmienić nazwy tych Configuration.cs
plików, w przeciwnym razie będą skargi na posiadanie dwóch z nich. Zmieniłem nazwę plików na ConfigA.cs
i ConfigB.cs
EDIT : (Dzięki Uprzejmości Kevina Mcpheata) pamiętaj podczas zmiany nazwy konfiguracji.cs Pliki, również zmienić nazwy klas i konstruktorów / edytuj
Z tą strukturą można po prostu zrobić
PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB
, który utworzy pliki kodu do migracji w folderze obok plików konfiguracyjnych (miło jest trzymać te pliki razem)
PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB
I wreszcie te dwa polecenia zastosują poprawne migracje do baz danych corrseponding.
EDIT 08 Feb, 2016: Zrobiłem małe testy z EF7 wersja 7.0.0-rc1-16348
Nie udało mi się uruchomić opcji-o|--outputDir. Dawało Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Wygląda jednak na to, że po pierwszym dodaniu migracji jest ona dodawana do folderu Migracje, a kolejna migracja dla innego kontekstu jest automatycznie umieszczana w subdolderze migracji.
Oryginalne nazwy ContextA
wydają się naruszać niektóre konwencje nazewnicze, więc teraz używam ContextAContext
i ContextBContext
. Używając tych nazw można użyć następujących poleceń:
(Uwaga że mój dnx nadal działa z konsoli Menedżera pakietów i nie lubię otwierać osobnego okna CMD do migracji) {]}
PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"
Spowoduje utworzenie migawki modelu i początkowej migracji w folderze Migrations
dla ContextAContext
. Utworzy folder o nazwie ContextB
zawierający te pliki dla ContextBContext
Dodałem ręcznie folder ContextA
i przeniosłem pliki migracji z ContextAContext
do tego folderu. Następnie zmieniłem nazwę przestrzeni nazw wewnątrz tych plików (plik migawki, początkowa migracja i zauważ, że w pliku migracji początkowej znajduje się trzeci plik ... projektant.cs). Musiałem dodać .ContextA
do przestrzeni nazw, a stamtąd framework ponownie obsługuje ją automatycznie.
Użycie następujących poleceń utworzyłoby nową migrację dla każdego kontekstu
PM> dnx ef migrations add Update1 -c "ContextAContext"
PM> dnx ef migrations add Update1 -c "ContextBContext"
I wygenerowane pliki są umieszczane w odpowiednich folderach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 09:16:23
Jeśli masz już "Configuration" z wieloma migracjami i chcesz zachować to tak, jak jest, zawsze możesz utworzyć nową klasę "Configuration", nadać jej inną nazwę, jak
class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
...
}
Następnie wystarczy wydać polecenie
Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName
I EF rusztuje migrację bez problemów. W końcu zaktualizuj swoją bazę danych, od teraz EF będzie narzekał, jeśli nie powiesz mu, którą konfigurację chcesz zaktualizować: {]}
Update-Database -ConfigurationTypeName MyNewContextConfiguration
Zrobione.
You don ' t need to deal with Enable-Migrations, ponieważ spowoduje to, że "Configuration" już istnieje, a zmiana nazwy istniejącej klasy konfiguracji spowoduje problemy w historii migracji.
Możesz kierować różne bazy danych, lub te same, wszystkie konfiguracje będą współdzielić tabelę _ _ MigrationHistory ładnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 14:33:15
Jeśli istnieje więcej baz danych, użyj następujących kodów w PowerShell
Add-Migration Starter -context EnrollmentAppContext
-
'Starter" jest nazwą migracji
-
'EnrollmentAppContext' to nazwa kontekstu mojej aplikacji
Możesz otworzyć PowerShell w VS wykonując:
Tools->NuGet Package Manager->Package Manager Console
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-12 07:48:49
Aby zaktualizować bazę danych wpisz następujące kody w PowerShell...
Update-Database -context EnrollmentAppContext
*jeśli istnieje więcej niż jedna baza danych, użyj tylko tego kodu, w przeciwnym razie nie jest to konieczne..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-12 06:45:26
EF 4.7 faktycznie daje podpowiedź podczas uruchamiania Enable-migrations w wielu kontekstach.
W usłudze assembly ' znaleziono więcej niż jeden typ kontekstowy.Domena".
To enable migrations for 'Service.Domain.DatabaseContext.Context1',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context1.
To enable migrations for 'Service.Domain.DatabaseContext.Context2',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context2.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-06 13:37:13