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

Wil*_*Wil 5 c# entity-framework ef-code-first

我一直在关注ASP.Net电影数据库教程,一切顺利.

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

关于不匹配的正确错误 - 这是预期的.

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

接下来,我删除了评级专栏,因为我想按照教程学习DropCreateDatabaseIfModelChanges- 然而,我只是得到了错误Invalid column name 'Ratings'.

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

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

2)我该如何解决?

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

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

Lad*_*nka 5

我认为你的描述必须是不正确的,因为正确的行为会抛出异常,尽管手动添加了Rating列.

此行为的工作原理如下:

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

手动添加Rating列不会更改存储的哈希值,但模型的哈希值会有所不同.

通过删除IncludeMetadataConvention约定可以完全删除此行为:

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