11

Nie mogę ustalić, dlaczego moja ostatnia migracja nie jest wykonywana automatycznie po uruchomieniu aplikacji (lub przynajmniej przy pierwszym dostępie do kontekstu bazy danych). Kiedyś w trakcie programowania wykonywałem ręcznie aktualizację bazy danych, ale chcę sprawdzić, czy uaktualni się automatycznie w moim hostowanym środowisku testowym.MigrateDatabaseToLatestVersion nie wykonano

W Application_Start():

Database.SetInitializer<FepazoContext>(
    new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>()) 

W FepazoConfiguration:

internal sealed class FepazoConfiguration : 
    DbMigrationsConfiguration<Fepazo.Models.FepazoContext> 
{ 
    public FepazoConfiguration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 

nawet dodaje to do konstruktora FepazoContext:

public FepazoContext() : base("DefaultConnection") 
{ 
    Database.Initialize(false); 
} 

Niektóre dodatkowa informacja:

  • Migracja został automatycznie utworzony przez dodatek migracji i wygląda ok.
  • Kiedy wysyłam zapytanie do tabeli __MigrationHistory, widzę, że migracja nie została jeszcze "zarejestrowana" jako wykonana.
  • Sprawdziłem, że ustawienie inicjatora lub AutomaticMigrationsEnabled nie jest przesłonięte w pliku Web.config.
  • Punkty przerwania w FepazoContext konstruktorze i FepazoConfiguration otrzymywane trafienie.

Czy coś zapomniałem? Czy mogę głębiej zagłębić się, aby dowiedzieć się, gdzie jest źle?

Aktualizacje

Uboczny True do Database.Initialize spróbować wymusić migracja ma też żadnego efektu. Database.CompatibleWithModel(true) zwraca wartość false - system wykrywa różnicę, ale nie wykonuje oczekującej migracji!

public FepazoContext() : base("DefaultConnection") 
{ 
    if (!Database.CompatibleWithModel(true)) 
    { 
     // This is executed (each time the code enters) 
     Database.Initialize(true); 
    } 
} 

Obejście

Jako obejście, wzywam DbMigrator.Update() wyraźnie tuż po ustawieniu inicjatora. Że załatwia sprawę, choć wciąż chciałbym wiedzieć, dlaczego to nie działa automatycznie ...

protected void Application_Start() 
{ 
    // <...> 
    Database.SetInitializer<FepazoContext>(
     new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>()); 
    var dbMigrator = new DbMigrator(new FepazoConfiguration()); 
    dbMigrator.Update(); 
    // <...> 
} 

Odpowiedz

1

W powyższym fragmencie kodu masz natychmiast wywołując Database.Initialize() metody po utworzeniu instancja kontekstu. W tym przypadku baza danych zostanie utworzona natychmiast po wywołaniu metody Initialize(), zamiast czekać, aż kontekst zostanie użyty po raz pierwszy.

Metoda Initialize() pobiera parametr Boolean, który określa, czy proces inicjowania powinien zostać ponownie uruchomiony, jeśli został już uruchomiony dla aplikacji.

Podanie false spowoduje pominięcie procesu inicjalizacji, jeśli zostało już wykonane. Wartość true zainicjalizuje bazę danych ponownie, nawet jeśli została już zainicjowana.

+0

Dzięki za odpowiedź. To nie wyjaśnia, dlaczego system nie wykrywa, że ​​musi zaktualizować bazę danych przy użyciu najnowszej migracji. Próbowałem przekazać 'true' jako parametr do' Database.Initialize() ', aby wymusić aktualizację, ale nawet to nie wykonuje. –

6

Według another answer on here inicjator nie działa, dopóki nie nastąpi jakaś interakcja z bazą danych. Odpowiedź wyjaśnia, w jaki sposób wymusić natychmiast uruchomienie inicjalizatora.

+0

Oczywiście, dlatego dodałem "(lub przynajmniej pierwszy dostęp do kontekstu bazy danych)" w moim pierwszym zdaniu, i dlaczego powiedziałem, że próbowałem 'Database.Initialize (true);' bez skutku. Niestety rozwiązanie tego problemu nie jest proste;) –

+0

Wow, spędziłem 15 minut na zapoznanie się z tym problemem, ponieważ uruchamiałem moją aplikację, ale nie logowałem się (/ wchodząc w interakcję z aplikacją), w rzeczy samej, musi ona współdziałać z DB, aby wykonać migracja: ") – edencorbin

0

Miałem ten problem. Mój problem okazał się, że miałem MigrationsContextFactory, który był używany do dostarczenia ciągu połączenia. Podczas inicjowania bazy danych wywołano fabrykę kontekstu migracji. Ten MigrationsContextFactory pobierał ciąg połączenia do innej bazy danych i upewniał się, że jest aktualny.

Usunąłem MigrationsContextFactory i przekazałem wartość true do MigrateDatabaseToLatestVersion<,> Migrator, aby poinformować, że należy użyć bieżącego kontekstu. Zobacz to pytanie do góry wybrana odpowiedź How do I inject a connection string into an instance of IDbContextFactory<T>?

Powiązane problemy