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.