MVC3 / EF - Изменение модели ... Несоответствие схемы базы данных - PullRequest
5 голосов
/ 13 марта 2011

Я следовал учебному пособию по ASP.Net Movie Database , и все шло хорошо.

Я только что изменил модель и добавил атрибут.Назовите меня любопытным, но я не хотел следовать руководству просто отбросить базу данных - я хотел посмотреть, могу ли я изменить.

правильная ошибка возникла из-за несоответствия -что и ожидалось.

Я добавил столбец оценок в базу данных, и все заработало.

Затем я удалил столбец оценок, так как я хотел следовать учебнику и узнать о DropCreateDatabaseIfModelChanges -однако, я просто получаю сообщение об ошибке Invalid column name 'Ratings'.

За все это время запись ModelHash не изменилась, и я понятия не имею, откуда она знает, что есть разница между сейчас или раньше.

Итак - 1) Я что-то напортачил?

2) Как можно исправить?

3) Как он узнал до того, что что-то изменилось, но не сейчас, когда хешне изменился?

4) Есть ли какой-нибудь дополнительный совет, который вы можете дать?

1 Ответ

5 голосов
/ 14 марта 2011

Я думаю, что ваше описание должно быть неправильным, потому что правильное поведение вызовет исключение, несмотря на добавленный вручную столбец Rating.

Это поведение работает следующим образом:

  1. Когда база данныхдобавлена ​​созданная новая таблица с именем EdmMetadata.
  2. EdmMetadata содержит два столбца - Id и ModelHash.
  3. Часть создания базы данных хранит одну строку с хешем текущей модели.
  4. Если база данных не была создана текущим контекстом, контекст выполняет запрос для извлечения хеша сохраненной модели перед первой операциейвыполнен.Полученный has сравнивается с текущим хешем контекста.
  5. Если хеш-код не совпадает, а инициализация базы данных не разрешена инициализатором базы данных, генерируется исключение.
  6. Если хеш-код совпадает, выполняется требуемая операция дБ.

Добавление вручную Rating столбца не изменит сохраненный хеш, но хеш модели будет другим.

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove(modelBuilder.Conventions
            .OfType<IncludeMetadataConvention>().ToArray());
    }
...