ошибка изменения модели и таблицы EF 4.1 - PullRequest
1 голос
/ 23 апреля 2011

В моем приложении MVC3 есть следующая модель, и я сначала использую код фрейма объекта 4.1.

public class Movie
{
    public int Id { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public string Director { get; set; }

    [CustomValidation(typeof(MovieValidator), "ValidateReleaseDate")]
    public DateTime ReleaseDate { get; set; }
}

Нет, если я удаляю атрибут Required из Title и Director и делаю их обнуляемыми в базе данных (которая автоматически создается кодом EF сначала из вышеупомянутой модели), я получаю следующую ошибку:

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

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

1) удалите базу данных, чтобы EF мог воссоздать ее

2) добавить следующие строки в классе контекста: (это не работает в контексте с EF 4.1, я добавил в application_start, и это работает. Почему это не работает в контексте calss сейчас?)

Database.SetInitializer<MoviesDB>(
    new DropCreateDatabaseIfModelChanges<MoviesDB>());

3) сопоставить таблицу с моделью (моя модель точно такая же, как таблица, почему я все еще получаю эту ошибку?)

Пожалуйста, предложите ответы на вопросы, упомянутые в пунктах 2 и 3.

Спасибо.

1 Ответ

3 голосов
/ 23 апреля 2011

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

Обновление базы данных вручную не работает, если вы используете автоматическое обнаружение изменений (поведение по умолчанию). Когда контекст создает модель, он вычисляет хеш из этой модели и сравнивает его со значением, хранящимся в таблице EdmMetadata (таблица создается в первый раз, когда EF создает базу данных). Если значение, загружаемое из базы данных, отличается, EF либо запускает восстановление базы данных (если настроен инициализатор), либо выдает исключение, которое вы видите. Изменение базы данных вручную не приведет к изменению хеша, хранящегося в EdmMetadata, поэтому модель все равно будет считать, что база данных не изменилась.

Это поведение можно удалить, удалив IncludeMetadataConvention:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    model.Conventions.Remove<IncludeMetadataConvention>();
}

После удаления этого соглашения EF не будет использовать таблицу EdmMetadata и не будет проверять изменения в модели. Обновление базы данных будет полностью за вами.

...