Entity Framework Code First Migrations считает, что есть изменения, которых не должно быть
У меня есть веб-сайт и служба Windows, которые ссылаются на один и тот же проект, чтобы получить контекст данных Entity Framework. Каждый раз, когда я запускаю службу Windows, Entity Framework запускает автоматическую миграцию, которая изменяет один из столбцов базы данных с NOT NULL на NULL (другие изменения не вносятся). Свойство для этого столбца помечено как [Обязательное], и веб-сайт (который указывает на точно такую же версию точно такой же библиотеки DLL для своей модели) правильно считает, что для этого столбца база данных должна быть NOT NULL.
Я попытался отключить автоматическую миграцию, и, как и ожидалось, сервис потерпел крах, потому что сообщалось, что модель данных ожидала изменений, которые необходимо было применить.
Изменить Я узнал немного больше информации... кажется, что это происходит, потому что у меня есть атрибуты [Required] и [AllowHtml] в свойстве. Когда я удалил атрибут [AllowHtml], этого не произошло. Итак, мой вопрос сводится к следующему: 1) ожидается ли поведение, что [AllowHtml] не будет работать с [Обязательным], и 2) как это возможно, что это произойдет только тогда, когда веб-служба использует этот код, а не когда сайт использует код? Кажется, что веб-сервис полностью игнорирует [Обязательный], когда он видит [AllowHtml].
Я использую EF 5.
2 ответа
У меня были точные проблемы... Для ожидающих изменений мне нужно было добавить три строки в мой файл global.asax при запуске, вот как это выглядит:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
AuthConfig.RegisterOpenAuth();
Database.SetInitializer<EntityContext>(null);
EntityContext context = new EntityContext();
context.Database.Initialize(true);
}
Что касается [Allowhtml], вы используете mvc? ... насколько я могу судить, [AllowHtml] принадлежит пространству имен System.Web.Mvc: http://msdn.microsoft.com/en-us/library/system.web.mvc.allowhtmlattribute(v=vs.98).aspx. AllowHtml предназначен для использования только для привязки модели типа. Они не предназначены для привязки модели Form, QueryString или FormCollection. http://forums.asp.net/t/1645209.aspx Если свойство помечено атрибутом AllowHtmlAttribute, среда ASP.NET MVC пропускает проверку этого свойства во время привязки модели, таким образом игнорируя ваш атрибут [Required]...
Причина, по которой столбец изменяется с NOT NULL на NULL, заключается в том, что атрибут [Required] переопределяет правило схемы базы данных, которое позволяет полю данных быть пустым. http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx
Надеюсь это поможет...
В проекте EF пытались ли вы отключить автоматические миграции, а затем заставить EF не синхронизировать модель и базу данных?
В вашем файле global.asax добавьте:
Database.SetInitializer<dbContext>(null);
Это удалит сообщение о том, что ожидающие миграции должны быть применены
Ура, Бартек