Ручное редактирование базы данных в первой структуре сущности кода

Я пробовал EF 4.1 (code first) с MVC 3. Я думаю, впереди, когда приложение потребует изменений. Я проверил несколько сценариев. Мне нравится идея ручного редактирования базы данных при изменении модели (моих POCOs).

Ошибка ASP.NET при изменении модели:

"Модель, поддерживающая контекст" CTCMContext ", изменилась с момента создания базы данных. Либо вручную удалить/обновить базу данных..."

Теперь он говорит, что я могу " вручную обновить базу данных", но я сделал и все еще получаю ту же ошибку. Я что-то упускаю!!?!

ИЗМЕНИТЬ

Связано ли это с хешем модели, генерируемым EF?

Ответ 1

У меня тоже были проблемы с этим. Я обнаружил, что, когда вы позволяете EF создавать свою базу данных для вас, создается таблица с именем dbo.EdmMetadata, и это где/как EF отслеживает состояние модели. Я обнаружил, что если вы удалите эту таблицу после того, как база данных была изначально создана, вы поместите вещи в "ручной режим", где теперь вы можете вручную добавлять/удалять столбцы, таблицы и т.д. Из своей базы данных, а EF не будет вызывать ошибку, которую вы смотри.

Если вы хотите, чтобы EF обновлял вашу базу данных при внесении изменений в вашу модель, вам нужно будет создать и вызвать класс ContextInitializer, который наследует от DropCreateDatabaseIfModelChanges или DropCreateDatabaseAlways в зависимости от поведения, которое вы хотите выполнить.

Ответ 2

Как я вижу, на самом деле нет встроенных методов EF для генерации кодовых данных.

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

ОБНОВЛЕНИЕ: EF 5.0 теперь поддерживает миграции

Ответ 3

измените класс на новые имена полей, удалите таблицу "EdmMetaData", а затем перекомпилируйте приложение.

Вы будете нести ответственность за изменение имени поля в своих представлениях.

он работает для меня.

Ответ 4

Я знаю, что это было отмечено как решено, но в моем случае это не сделало трюк.

Как только я удалил dbo.EdmMetadata, я получил другую ошибку:

Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

То, как это сработало для меня, было удалить класс Initializer из Application_Start:

void Application_Start(object sender, EventArgs e)
{
    // MyDB.SetInitializer<MyContext>(new MyInitializer());
}