У меня есть приложение 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), очистить и повторно добавить ссылки, восстановить базу данных и повторно опубликовать.Теперь все работает отлично.