EF Code First считает, что база данных устарела - только в производстве - PullRequest
2 голосов
/ 28 мая 2011

У меня есть приложение ASP.NET MVC 3, использующее SQL Server CE 4.0 и Entity Framework 4.1 Code First. Локально работает , но в работе происходит сбой со следующей ошибкой:

Модель, поддерживающая контекст 'foobar', изменилась с момента создания базы данных.Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer.Например, стратегия DropCreateDatabaseIfModelChanges автоматически удалит и заново создаст базу данных и при необходимости заполнит ее новыми данными.

Я проверил, что мои dll приложения и файл базы данных обновлены наудаленный сервер, но я продолжаю получать эту ошибку.

Любая идея, в чем может быть проблема?

Примечание: я использую RTF-версию Entity Framework 4.1, а не CTP.

Редактировать

Хорошо, если я удалю таблицу EdmMetadata и повторно опубликую базу данных на рабочем сервере, я больше не получаю сообщение об ошибке.Однако я совершенно не понимаю, зачем мне это делать.Модель не изменилась .Это не изменилось за недели, и я восстановил базу данных только сегодня.Я думаю, ключом ко всему этому является хеш.С чем сравнивается хеш EdmMetadata?

Edit 2

Согласно ответу Марка S, хеш в таблице EdmMetadata сравнивается с хешем SSDL.Тем не менее, нет никакого реального файла SSDL (нет файла с расширением .ssdl и нет файла, содержащего "ssdl") где-либо в решении.Итак, где же хранится SSDL?Он генерируется во время разработки или во время выполнения?

Редактировать 3

Чтобы ответить на мой собственный вопрос, SSDL генерирует и кэширует во время выполнения(подробнее здесь ), но, глядя на реальную схему SSDL, я не уверен, что вижу что-то, что может измениться просто потому, что DLL проекта находится в другом месте на другом сервере.


Примечание. Я использую один и тот же файл базы данных (.sdf) для тестирования и производства.Я буквально ftp-файл из bin / App_Data в папку App_Data на рабочем сервере.Я также ftp-проект библиотеки DLL.Таким образом, единственное, что должно отличаться между тестированием и производством, это то, что эти файлы живут в другом месте.

Кроме того, просто для записи, вот моя строка подключения:

DataSource=|DataDirectory|foobar.sdf" providerName="System.Data.SqlServerCe.4.0

Редактировать 4 (окончательное редактирование?)

Проблема оказалась проблемой DLL.Я думаю, что другая версия библиотеки EntityFramework использовалась удаленно, а не локально.Решение состояло в том, чтобы убедиться, что у меня установлена ​​последняя версия EF 4.1 (RTW), очистить и повторно добавить ссылки, восстановить базу данных и повторно опубликовать.Теперь все работает отлично.

Ответы [ 3 ]

6 голосов
/ 28 мая 2011

В ответ на вопрос «С чем сравнивается хеш EdmMetadata?»

Таблица EdmMetadata позволяет Code First определить, совпадает ли модель в вашем коде с моделью в вашей базе данных.Таблица содержит одну строку, которая является хешем вашего SSDL.SSDL расшифровывается как язык определения схемы магазина и является языком на основе XML, используемым для описания модели сущностей и сопоставлений между моделями.

Подробнее о SSDL и просмотре спецификации можно узнать по адресу http://msdn.microsoft.com/en-us/library/bb399559.aspx * 1007.*

Вы упоминаете, что все работает хорошо локально, но не на производстве.Вы позволяете Code First создавать как локальные, так и производственные базы данных?Производственная база данных уже существует или создается другим способом?

CodeFirst сообщает, что хеш в базе данных не соответствует хешу текущей модели, поэтому что-то должно отличаться.Выяснение того, что может быть проблемой.

Таблица EdmMetadata сопоставлена ​​с классом EdmMetadata.В этом классе есть метод TrygetModelHash, который можно использовать для получения хеша для данного контекста.Если вы отчаялись, вы можете использовать это для сравнения вашей текущей модели с хешем, который есть в вашей производственной базе данных.Это, по крайней мере, избавит вас от необходимости постоянно создавать новую базу данных только для тестирования.

Вы также можете указать Code First исключить таблицу EdmMetadata при желании.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
3 голосов
/ 28 мая 2011

Отключить проверку:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
1 голос
/ 28 мая 2011

Проверьте это видео:

http://www.pluralsight -training.net / Microsoft / игроков / PSODPlayer.aspx? Автор = Скот-шестигранника & имя = mvc3-здание-данных я и режим = жить и клип = 0 и, конечно = aspdotnet-mvc3-интро

Это часть бесплатной тренировки множественного зрения, доступной на http://asp.net/mvc. Нажмите видео «Когда меняются классы» в левой части страницы, затем перейдите к 8:30 в видео.

Очевидно, что если вы удалите таблицу EDMMetadata в БД, EF отключит проверку модели.

...