MVC3 / EF - 更改模型...数据库模式不匹配

时间:2011-03-13 16:55:15

标签: c# entity-framework ef-code-first

我一直关注着ASP.Net Movie Database Tutorial,而且一切顺利。

我刚刚更改了模型并添加了一个属性。叫我好奇,但我不想按照刚刚删除数据库的指南 - 我想看看我是否可以修改。

correct error出现了一个不匹配的情况 - 这是预期的。

我将评级列添加到数据库中,一切正常。

接下来,我删除了评分专栏,因为我想按照教程了解DropCreateDatabaseIfModelChanges - 但是,我只是收到错误Invalid column name 'Ratings'.

在所有这段时间里,ModelHash条目没有改变,我不知道它是如何知道现在或之前存在差异的。

所以 - 1)我搞砸了什么?

2)我该如何解决?

3)在事情发生变化之前,它是如何知道的,但现在当哈希没有改变时却不知道?

4)您可以提供其他建议吗?

1 个答案:

答案 0 :(得分:5)

我认为您的描述必须不正确,因为尽管手动添加了Rating列,但正确的行为会引发异常。

此行为的工作原理如下:

  1. 创建数据库时,会添加名为EdmMetadata的新表。
  2. EdmMetadata包含两列 - IdModelHash
  3. 数据库创建的一部分是存储具有当前模型哈希的单行。
  4. 如果当前上下文未创建数据库,则上下文执行查询以在执行第一个操作之前检索存储的模型哈希。将检索到的has与上下文的当前哈希进行比较。
  5. 如果散列不相同,并且数据库初始化程序不允许数据库重新创建,则抛出异常。
  6. 如果hash相同,则执行所需的db操作。
  7. 手动添加Rating列不会更改存储的哈希值,但模型的哈希值会有所不同。

    删除IncludeMetadataConvention约定:

    可以完全删除此行为
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove(modelBuilder.Conventions
                .OfType<IncludeMetadataConvention>().ToArray());
        }