Jak mogę wyłączyć pierwsze migracje kodu


85

Mam model jednostki z pierwszym kodem w EF5. Ale chcę ręcznie zarządzać zmianami bazy danych - nie chcę, aby EF modyfikował moją istniejącą bazę danych i wszystkie jej dane. Ale kiedy wprowadzam równoległe zmiany w mapowaniu EF iw bazie danych, EF odmawia prawidłowego działania, informując mnie, że muszę najpierw użyć migracji kodu. Jak to wyłączyć?


Odpowiedzi:


100

ustaw Database.SetInitializer na null.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
Ustawienie inicjatora w konstruktorze wystąpienia kontekstu nie ma sensu. EF wywoła inicjator, zanim faktycznie przejdzie do tego kodu, jeśli spróbujesz utworzyć nowy kontekst.
Jcl,

1
Właśnie zweryfikowałem odpowiedź, przeglądając „Narzędzie diagnostyczne” w VS 2017. Wywołania ADO.NET przed zatrzymaniem pierwszego poszukiwanego zapytania SQL po ustawieniu funkcji inicjującej na wartość null w konstruktorze.
Karl

2
Działa zgodnie z oczekiwaniami. To prawda, że ​​EF wywoła inicjator wcześniej, ale później wywołanie go ponownie w konstruktorze powoduje, że DbContext po prostu zignoruje migracje, na wypadek gdybyś chciał zignorować fakt, że __MigrationHistorynie masz najnowszej migracji, a nie chcesz zrobić to mimo wszystko. W moim przypadku korzystam z migracji w środowisku deweloperskim, ale kiedy wdrażam do produkcji, używam SSDT do aktualizacji bazy danych. Dlatego EF narzekałby, że model się zmienił, ponieważ __MigrationHistorynie miałby najnowszej migracji, ale mogę zagwarantować, że baza danych jest zaktualizowana.
Alisson

Sugerowałbym przeniesienie wywołania do Database.SetInitializerz konstruktora do konstruktora klasy. Dzięki temu połączenie zostanie wykonane tylko raz.
Steven

40

Więc najbardziej kompletna odpowiedź, jaką znalazłem, jest taka:

  1. Usuń Migrationsfolder wewnątrz projektu.
  2. Ustaw Database.SetInitializer<DatabaseContext>(null);wewnątrz inicjatora DatabaseContext.
  3. Usuń tabelę __MigrationHistoryz bazy danych. W EF6 + tabela znajduje się pod, Tablesale we wcześniejszych wersjach znajduje się pod System Tables.
  4. Buduj i uruchamiaj.
  5. Zysk.

Niestety po wykonaniu tych kroków EF6 nadal sprawdza, czy istnieje za __MigrationHistorykażdym razem, gdy moja aplikacja jest uruchamiana, co powoduje wydłużenie czasu uruchamiania mojej aplikacji o kilka milisekund. Czy istnieje sposób na __MigrationHistorycałkowite wyłączenie kontroli?
Dai

27

Jeśli chcesz całkowicie wyłączyć migracje:

https://stackoverflow.com/a/9709407/141172

Jednak uważam, że lepiej jest pozostawić włączone migracje kodu w pierwszej kolejności, ale użyj -Scriptopcji, aby EF utworzył dla mnie skrypt zmiany bazy danych, który mogę zastosować do każdej bazy danych (programowanie, kontrola jakości, produkcja) ręcznie:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

W ten sposób EF utworzy dla mnie skrypt zmiany, a ja nadal mam pełną kontrolę nad wprowadzanymi zmianami. Wersjonuję skrypty zmian jak każdy inny kod źródłowy.


1
Twój link tak naprawdę nie odpowiada completely turn off migrations. Aby to zrobić: dodaj Database.SetInitializer<YourContextType>(null)do uruchomienia swojej aplikacji
Don Cheadle

Masz jakiś pomysł, jak to osiągnąć dzięki EF Core?
Shimmy Weitzhandler

@Shimmy: EF Core nigdy nie powinien automatycznie próbować zmieniać bazy danych. Zobacz github.com/dotnet/efcore/issues/3152
Eric J.

26

Jeśli korzystałeś już z migracji, zmiana tylko inicjatora nie pomoże. Musisz przejść do Management Studio, otworzyć tabele bazy danych, przejść do System Tablesfolderu i usunąć __MigrationHistoryznajdującą się tam tabelę (w przypadku EF6 i nowszych znajduje się ona bezpośrednio pod Tables). Spowoduje to wyłączenie migracji na dobre.


7
Tabela __MigrationHistory znajduje się bezpośrednio pod tabelami, a nie tabelami systemowymi.
Peter Hedberg

6
@PeterHedberg Dotyczy to EF6 +. We wcześniejszych wersjach był pod System Tables.
Episodex

1
Możesz także zmienić nazwę tabeli, zamiast ją usuwać, używając sp_rename. Wyłączyłem też inicjator.
NMrt

2

Właśnie rozwiązałem ten „problem” przez

  1. Usuwanie tabeli „_MigrationHistory” z bazy danych.
  2. Usunięcie folderu „Migrations” z projektu.
  3. Aktualizacja pliku EDMX.
  4. Wyczyść projekt i odbuduj go.

Konfiguracja mojego środowiska jest następująca

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

Czy mogę zapytać, co zaktualizowałeś w pliku EDMX? Używam również Database First i nadal odpytuję nieistniejące tabele migracji ... Dzięki!
dalcam

Co jeśli później będziemy potrzebować migracji, czy _MigrationHistoryautomatycznie utworzy nową tabelę?
sairfan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.