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.

Author: aknuds1, 2012-11-20

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
 126
Author: ckal,
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ą":

  1. Usuń istniejące .pliki cs w folderze migracje
  2. w SSMS Usuń system _ _ MigrationHistory stolik.

Tworzenie migracji początkowej:

  1. W Konsoli Menedżera Pakietów:

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
    
  2. 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

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
    
  4. 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

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
    
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
    
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

Kroki tworzenia skryptów migracji w konsoli Menedżera pakietów:

  1. 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.

  2. 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
    
 102
Author: Eric J.,
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.

 82
Author: bart s,
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.

 7
Author: Guillermo Ruffino,
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

 4
Author: AHAMED AAQIB,
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..

 3
Author: AHAMED AAQIB,
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.
 0
Author: Davit Mikuchadze,
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