Редактирование базы данных вручную в коде первой сущности - PullRequest
12 голосов
/ 18 мая 2011

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

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

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

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

EDIT

Это имеет отношение к хешу модели, сгенерированному EF?

Ответы [ 4 ]

9 голосов
/ 19 мая 2011

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

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

0 голосов
/ 13 января 2014

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

После удаления 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());
}
0 голосов
/ 05 декабря 2011

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

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

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

0 голосов
/ 25 мая 2011

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

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

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

...