Подтвердить что ты не робот

EF 4 Code First: Совместимость модели не может быть проверена, потому что тип EdmMetadata не был включен в модель

Я пытаюсь использовать EF 4 Code First pattern. Мой код инициализации выглядит следующим образом:

Создать построитель моделей:

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

    //add entity classes about 12 of them

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

Создать сеанс:

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;
}

Это работает, когда я запускаю код в первый раз. Но при повторном запуске и попытке добавить объект с помощью context.Add(myEntity) я получаю следующее исключение:

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.

Я попытался удалить следующую строку:

builder.Conventions.Remove<IncludeMetadataConvention>();

но я все еще получаю ошибку.

4b9b3361

Ответ 1

Ну, это кажется немного глупым, но настоящим виновником было следующее утверждение:

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

Кажется, что DropCreateDatabaseIfModelChanges несовместим с подходом Code First, или это еще одна загадка, которую я пока не понимаю.

Ответ 2

Удаление IncludeMetadataConvention означает, что инициализатор не может определить, когда изменяется модель. Добавление его обратно не поможет либо потому, что оно создает таблицу метаданных для создания db, которая, очевидно, не будет существовать для существующих баз данных или баз данных, которые были созданы с отключенным условным обозначением.

Решение отбрасывает базу данных и разрешает соглашение или отключает инициализатор и обновляет базу данных другим способом (вручную или ef).

Ответ 3

Если вы получаете эту ошибку в VS 2012 и работаете в режиме отладки с помощью IIS Express, попробуйте перейти на Visual Studio Development Server.

Я получал ту же ошибку в первом приложении asp.net mvc 4, использующем Visual Studio 2012 на компьютере под управлением Windows 7, попав в SQL Server LocalDb (сервер, без *.mdf), работающий на моем локальном хосте в режиме отладки.

Мой инициализатор отмечен атрибутом DropCreateDatabaseIfModelChanges, и я вызываю Database.Initialize в Global.ascx.cs Application_Start. Если база данных отбрасывается и воссоздается, как она может жаловаться на недостающую таблицу миграции? Это особенно волновало, потому что я создал другое веб-приложение, используя тот же подход, и он работал безупречно.

Даже ручное удаление базы данных перед запуском приложения не устранило проблему.

Сравнивая "хорошее" приложение с "плохим" приложением, единственное различие заключалось в выборе веб-серверов. "Хорошее" приложение использовало Visual Studio Development Server; "плохой" используется IIS Express.

Я переключил "плохое" приложение на Visual Studio Development Server, и ошибка исчезла!

У меня нет времени вникать в "почему" прямо сейчас, но, видимо, что-то неправильное кэшируется IIS Express.