8

Próbuję użyć kodu First z migracjami. Mimo że nie ma żadnych bieżących zmian w moim modelu, otrzymuję wyjątek. Kiedy dodać do migracji, w górę iw dół są puste, ale pojawia się błąd wykonania z komunikatem następująco:Model wspierający kontekst "DataContext" zmienił się od czasu utworzenia bazy danych

Wyjątek System.InvalidOperationException typu „” wystąpił w EntityFramework.dll ale nie był obsługiwany w kodzie użytkownika

Informacje dodatkowe: Model wspierający kontekst "MyDataContext" zmienił się od czasu utworzenia bazy danych. Rozważyć użycie kod najpierw Migracje do aktualizacji bazy danych (http://go.microsoft.com/fwlink/

Moja architektura jest następujący:

  • projekt DataAccess że zawiera kontekstu konfiguracje płynu i kod migracje
  • projektu modelu, który zawiera klasy poco
  • Projekty Web API i MVC, które zawierają ciąg połączeń w odpowiednich plikach web.config:

Dodatkowo mam następujący kod:

DbInitializer

public static MyDataContext Create() 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataAccess.MyDataContext, MyDataAccess.Migrations.Configuration>()); 
    return new MyDataContext(ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString, null); 
} 

Zacząłem AutomaticMigrationsEnabled = false; w konstruktorze konfiguracji migracji, ponieważ zrozumiałem, że pozwoli to (i wymaga), żebym miał większą kontrolę nad tym, kiedy migracje zostały zastosowane. Próbowałem również ustawić to prawda, ale z tym samym wynikiem.

Po otrzymaniu tego błędu dodałem nową migrację, a metoda Up była pusta. Zaktualizowałem bazę danych do tej nowej migracji, a rekord został utworzony w tabeli _migrationHistory, ale nadal otrzymuję błąd podczas próby uruchomienia aplikacji. Ponadto dane źródłowe nie zostały dodane do bazy danych.

protected override void Seed(MyDataAccess.MyDataContext context) 
{ 
      IdentityResult ir; 

      var appDbContext = new ApplicationDbContext(); 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(appDbContext)); 
      ir = roleManager.Create(new IdentityRole("Admin")); 
      ir = roleManager.Create(new IdentityRole("Active")); 
      ir = roleManager.Create(new IdentityRole("InActive")); 

      var userNamager = new UserManager<User>(new UserStore<User>(appDbContext)); 

      // assign default admin 
      var admin = new User { UserName = "administrator", Email = "[email protected]" }; 
      ir = userNamager.Create(admin, "[email protected]"); 

      ir = userNamager.AddToRole(admin.Id, "Admin"); 
} 

gdzie

public class ApplicationDbContext : IdentityDbContext<User> 
{ 
    public ApplicationDbContext() 
     : base("MyDataContext", throwIfV1Schema: false) 
    { 
    } 
    ... 

Pytanie: Jeżeli Dodaj migracji nie widzi żadnych zmian w modelu, dlaczego ten błąd podczas uruchamiania? Dlaczego kod nasion nie został trafiony? Jak mogę to naprawić, lub jeśli nie można tego ustalić, w jaki sposób mogę dalej określić główną przyczynę?

Odpowiedz

5

ten pracował dla mnie.

idź do Package Manager Console i run - -force Update Database

+0

Pracował jak urok! Wielkie dzięki. Utknąłem przez wiele dni i zawsze kończyłem klonowanie całego projektu i budowanie. Jeszcze raz dziękuję! – OhmnioX

+0

, więc możesz mi powiedzieć proces ... gdzie znaleźć tę konsolę programu Package Manager? –

+0

W Visual Studio -> Menu narzędzi –

0

Założę się, że kontekst danych nie podpina łańcucha połączenia. Sprawdź, czy nie został zainicjalizowany za pomocą localdb (coś podobnego do (localdb)\v11.0) i nie działa z tym, gdy myślisz, że jest ustawiony na coś innego.

+0

+1 Zawsze otrzymuję ten błąd, gdy nie sprawdzam mojego lokalnego kodu połączenia z kodu źródłowego (Git Cherry-pick Local configs) –

14

Nie jestem pewien, czy znalazłeś odpowiedzi na swój problem, ale to inna odpowiedź znalazłem tu rzeczywiście zrobił to dla mnie: Entity Framework model change error

I rzeczywiście skończyło się usuwanie tabeli w programie SQL Server, które ja nie zrobił __MigrationHistory Wiem, że był tworzony automatycznie.

W artykule mówi także o opcji nie generują go myślę za pomocą tej instrukcji: Database.SetInitializer<MyDbContext>(null); ale nie zostały wykorzystane, więc nie jestem pewien, czy to działa jak ten

+0

Po prostu usunięcie wszystkich wierszy wydaje się mieć ten sam efekt. – SharpC

+0

To działało jak czar. Dziękuję bardzo! – MartinJH

0

Mój problem zakończył się konflikt między automatyczna migracja jest włączona i MigrateDatabaseToLatestVersion initializer opisanym here.