Код EF 4 первый: совместимость модели не может быть проверена, так как тип EdmMetadata не был включен в модель - PullRequest
13 голосов
/ 25 декабря 2011

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

Создание модели Builder:

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>();

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

Ответы [ 3 ]

30 голосов
/ 25 декабря 2011

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

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

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

4 голосов
/ 26 декабря 2011

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

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

0 голосов
/ 21 июля 2013

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

Я получал ту же ошибку в приложении asv.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.

...