8

Pierwszy, czytałem te pytania/odpowiedzi:Nie można uruchomić migrację EF5 z istniejącej bazy danych

Te wszystkie wydają się być dla EF wersje wcześniejsze niż EF5, a moja sytuacja nie pasuje do tych odpowiedzi. Tak, pozwól mi opisać moją sytuację.

  1. Moja aplikacja została oryginalnie utworzona przy użyciu EF4, model pierwszy. Zaprojektowałem moją bazę danych za pomocą projektanta GUI i wykorzystałem ją do wygenerowania mojej bazy danych.
  2. Prowadziłem i gromadzę dane w bazie danych przez kilka miesięcy. Naprawdę nie mogę stracić tych danych.
  3. Rozgałęziłem swój kod, zainstalowałem EF5 z NuGet i użyłem EF Power Tools do wygenerowania mojego modelu z mojej bazy danych, klikając prawym przyciskiem myszy nowy projekt biblioteki klas i wybierając Entity Framework | Reverse engineer code first.
  4. Udało mi się bezproblemowo powrócić do mojego nowego projektu, przekonwertować mój projekt na nowy DbContext zamiast ObjectContext i usunąć bibliotekę klasy EF4, która posiadała mój stary model. Program działa świetnie!

Teraz chcę wypróbować automatyczne migracje, z którymi miałem małe doświadczenie w Ruby on Rails. Oto co zrobiłem:

  1. Ran Enable-Migrations. Miałam kłopoty z powodu ciągów połączeń i aplikacji app.config, ale ostatecznie udało mi się. Jednak this MSDN page mówi, że powinno to automatycznie wygenerować pierwszą migrację, aby doprowadzić mnie do punktu, w którym już jestem. Tak nie było.
  2. Przebiegł Add-Migration InitialSchema, aby wykonać czynności, które nie zostały automatycznie wykonane w kroku 1. To zadziałało.
  3. Dodano właściwość do jednego z moich modeli obiektów, a następnie próbował uruchomić Add-Migration AddSerialToLogEntries i wręczono:

Nie można wygenerować wyraźny migrację ponieważ następujące wyraźne migracje są oczekujące: [201307190100268_InitialSchema] . Zastosuj oczekujące migracje jawne przed próbą wygenerowania nowej jawnej migracji .

Próba zastosowania migracji do istniejącej bazy danych nie powiodła się, co nie jest zaskakujące.

Inne odpowiedzi, o których wspomniałem powyżej, w zasadzie mówiły, że mam pecha, ale jak powiedziałem, były to dla starszych wersji Entity Framework. Czy mam tu jakieś opcje?

Pisząc to pytanie, pomyślałem, że będę mógł użyć programu SQL Server Management Studio do eksportu moich danych do skryptu SQL, usunięcia całej bazy danych, umożliwienia jej utworzenia przez EF, a następnie uruchomienia skryptów w celu odzyskania danych ... Spróbuję tego jutro, kiedy będę miał czas, ale chciałbym usłyszeć, czy są inne opcje, ponieważ nie jestem w 100% pewny, że to zadziała i nie chciałbym mieć żadnych błędów w danych wprowadzonych do procesu.

Odpowiedz

12

Włączanie ran - migracje. Miałam problem ze względu na ciągi połączeń i do których app.config się przyzwyczajał, ale ostatecznie go dostałem. Jednak na tej stronie MSDN jest napisane, że powinno to automatycznie wygenerować pierwszą migrację , aby doprowadzić mnie do punktu, w którym już jestem. Tak nie było.

Ran Add-Migration InitialSchema, aby wykonać to, co nie było automatycznie wykonane w kroku 1. To zadziałało.

W rzeczywistości komenda enable-migrations tworzy początkowy migrację tylko wtedy, gdy baza danych jest już utworzony z kodem pierwszego wcześniej w tym przypadku baza danych zawiera __MigrationHistory tabeli. Jeśli ta tabela nie istnieje (tak jak w przypadku istniejącej bazy danych, która nigdy wcześniej nie została utworzona za pomocą Code-First), enable-migrations tworzy tylko klasę Configuration. Musisz ręcznie zadzwonić pod numer add-migration, aby utworzyć pierwszą klasę migracji. Tak więc oczekiwane zachowanie.

Generalnie procedura przygotowania istniejącej bazy danych do migracji jest następująca jeśli używasz EF 5:

  • połączenia enable-migrations w konsoli menedżera pakietów. Zostanie utworzony folder w Twoim projekcie i Migrations.

  • Otwórz klasę Configuration i ustaw AutomaticMigrationsEnabled = false w konstruktorze (jeśli nie jest jeszcze domyślnie).

  • W Package Manager połączenia konsoli

    add-migration -IgnoreChanges InitialSchema 
    

    "InitialSchema" to tylko nazwa przykładem. Możesz nazwać go tak, jak chcesz. Zostanie utworzona klasa <Timestamp>_InitialSchema pochodząca z DbMigration. Metody Up i Down w tej klasie są puste ze względu na flagę -IgnoreChanges. Bez tej flagi klasa zawierałaby migrację, aby dodać cały model do bazy danych, co nie jest tym, czego potrzebujesz, ponieważ istniejąca baza danych zawiera już schemat bazy danych.

  • Uruchom update-database w konsoli menedżera pakietów. Ponieważ metoda Up jest pusta, ta aktualizacja nic nie robi z istniejącym schematem z wyjątkiem tworzy tabelę __MigrationHistory (jako tabelę systemową w bazie danych) i dodaje pierwszy rekord do tej tabeli, który zawiera model skrótu bieżącego modelu EF.

  • Opcjonalnie ostatni krok: Jeśli wolisz pracować z automatycznymi migracjami, otwórz klasę Configuration i ustaw AutomaticMigrationsEnabled = true w konstruktorze. Jeśli chcesz kontynuować migrację opartą na kodzie, pozostaw flagę false.

W tym momencie możesz zacząć wprowadzać zmiany w swoim modelu. Za każdym razem, gdy utworzysz nową migrację z add-migration, będzie ona oparta na modelu przed modyfikacją, a klasa migracji będzie zawierać tylko niezbędne zmiany schematu.

+0

Świetna, szczegółowa odpowiedź. Wypróbuję twoje kroki tak szybko, jak tylko będę mógł. Wiem, że mogę "cofnąć" włączanie migracji, po prostu usuwając folder Migracje, ale czy mogę po prostu usunąć pierwsze i poprzednie metody migracji zamiast ich usuwania i uruchamiania od nowa? – Steve

+0

@Steve: Tak, to też powinno działać. – Slauma

+0

Pracowałem świetnie, dziękuję! – Steve

3

chciałbym zaproponować nieco inne podejście, które zostawiają cię w stanie, w którym można korzystać z migracji do tworzenia baz danych od podstaw w środowisku programistycznym:

  1. zamiast nazywając add-migration -IgnoreChanges InitialSchema, postarać się generowanie początkowej migracji schematu do pracy. Tak jak mówisz, powinno się to zdarzyć, gdy początkowo zadzwoniłeś pod numer Enable-Migrations. Możesz spróbować wskazać połączenie z bazą danych w nieistniejącej bazie danych, aby to działało.

  2. Wskutek tego, czy migracja InitialSchema będzie zawierać logikę aby utworzyć bazę danych, jak to było w momencie, kiedy odwrotnej inżynierii go. Musisz komentować zawartość Up() i Down(), dopóki nie zostanie wdrożona we wszystkich środowiskach , które już mają istniejącą bazę danych.

  3. Następnie można odkomentowaniu zawartość tych metod i odtąd dalej, w swoich środowiskach programistycznych można upuścić baz danych i odtworzyć je za pomocą

    var migrator = new DbMigrator(new Configuration()); 
    migrator.Update(); 
    

    i będziesz miał pełny zestaw migracji w tabeli __MigrationHistory . Jest to ważne, ponieważ bez niego nie będzie można w przyszłości dodawać nowych migracji .

Powiązane problemy