2011-12-25 8 views
13

Próbuję użyć wzoru pierwszego kodu EF 4. Mój kod inicjalizacji jest następujący:Kod EF 4 Najpierw: Kompatybilność modelu nie może być sprawdzona, ponieważ typ EdmMetadata nie był zawarty w modelu

Tworzenie modelu Builder:

private static DbModelBuilder CreateModelBuild() 
{ 
    var builder = new DbModelBuilder(); 

    //add entity classes about 12 of them 

    builder.Conventions.Remove<IncludeMetadataConvention>(); 
    return builder; 
} 

Tworzenie sesji:

private bool BuildSqlServerSession(DbModelBuilder builder) 
{ 
    var model = 
    builder.Build(new SqlConnection(@"connection string")); 
    var cm = model.Compile(); 
    var context = new LittlePOSContext(cm); 
    var dbExists = context.Database.Exists(); 
    _session = new EFSession(context); 
    return dbExists; 
} 

Działa to po uruchomieniu kodu po raz pierwszy. Ale kiedy działa na drugi raz i próbuje dodać obiekt przy context.Add(myEntity) otrzymuję następujący wyjątek:

Model compatibility cannot be checked because the EdmMetadata type was not 
included in the model. Ensure that IncludeMetadataConvention has been added 
to the DbModelBuilder conventions. 

Próbowałem usuwając następujący wiersz:

builder.Conventions.Remove<IncludeMetadataConvention>(); 

ale nadal pojawia się błąd.

Odpowiedz

30

Dobrze czuje się nieco głupie, ale prawdziwym winowajcą było następujące oświadczenie:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>()); 

Wydaje się, że DropCreateDatabaseIfModelChanges nie jest kompatybilny z Code First podejścia lub jest jakiś inny mystry że nie rozumiem (jeszcze).

+22

Jest kompatybilny.Problem polega na tym, że za pierwszym razem, gdy go tworzysz, nie ma tabeli do śledzenia zmian modelu, dlatego też narzeka. Po utworzeniu bazy danych przez EF po raz pierwszy, można zmienić strategię inicjalizacji z powrotem na to, czym była. –

4

Usunięcie IncludeMetadataConvention oznacza, że ​​inicjator nie może stwierdzić, kiedy model się zmieni. Dodanie go z powrotem nie pomoże, ponieważ tworzy tylko tabelę metadanych na tworzenie bazy danych, co oczywiście nie będzie istnieć dla istniejących baz danych lub baz danych, które zostały utworzone z wyłączoną konwencją.

Rozwiązanie jest opuszczenie bazy oraz umożliwienie konwencję lub wyłączenie inicjatora i aktualizowanie bazy inny sposób (ręczne lub ef migracja)

0

Jeśli otrzymujesz ten błąd w VS 2012 i działają w trybie debugowania za pomocą IIS Express, spróbuj przejść do Visual Studio Development Server.

Otrzymałem ten sam błąd, w pierwszej aplikacji asp.net mvc 4 kodu, przy użyciu Visual Studio 2012 na komputerze z systemem Windows 7, uderzając SQL Server LocalDb (serwer, bez * .mdf), uruchomiony na moim lokalnym host w trybie debugowania.

Mój inicjator jest oznaczony za pomocą atrybutu DropCreateDatabaseIfModelChanges i nazywam Database.Initialize w Global.ascx.cs Application_Start. Jeśli baza danych jest upuszczana i odtwarzana, jak do cholery, może ona narzekać na brakującą tabelę migracji? Było to szczególnie przygnębiające, ponieważ skonfigurowałem inną aplikację internetową, stosując to samo podejście i działało bezbłędnie.

Nawet ręczne upuszczenie bazy danych przed uruchomieniem aplikacji nie rozwiązało problemu.

Porównując "dobrą" aplikację do "złej" aplikacji, jedyną różnicą był wybór serwerów internetowych. "Dobra" aplikacja korzystała z Visual Studio Development Server; "zły" używany IIS Express.

Zmieniłem "złą" aplikację na Visual Studio Development Server i błąd zniknął!

Nie mam czasu, aby zagłębić się w "dlaczego" właśnie teraz, ale najwyraźniej coś niepoprawnego jest buforowane przez IIS Express.

Powiązane problemy