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

5

我一直在跟随ASP.Net电影数据库教程, 一切都进行得很顺利。

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

正确的错误出现了不匹配的情况 - 这是预料之中的。

我向数据库添加了评分列,一切正常。

接下来,我删除了评分列,因为我想遵循教程并学习DropCreateDatabaseIfModelChanges - 然而,我只得到错误消息Invalid column name 'Ratings'.

在所有这些时间里,ModelHash条目没有改变,我不知道它如何知道现在或以前有什么区别。

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

2) 我该如何修复?

3) 为什么以前它知道有些事情已经改变了,但现在哈希值没有改变时却不知道了?

4) 你能提供额外的建议吗?

1个回答

5
我认为您的描述可能不正确,因为正确的行为将抛出异常,尽管手动添加了“评分”列。
此行为的工作方式如下:
1. 创建数据库时会添加名为“EdmMetadata”的新表。 2. “EdmMetadata”包含两个列 -“Id”和“ModelHash”。 3. 数据库创建的一部分是存储具有当前模型哈希的单行。 4. 如果数据库不是由当前上下文创建的,则在执行第一个操作之前,上下文会执行查询以检索存储的模型哈希。检索到的哈希与上下文的当前哈希进行比较。 5. 如果哈希不同并且数据库初始化程序不允许重新创建数据库,则会抛出异常。 6. 如果哈希相同,则执行所需的数据库操作。
手动添加“评分”列不会更改存储的哈希,但模型的哈希将不同。
通过删除“IncludeMetadataConvention”约定,可以完全删除此行为:
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove(modelBuilder.Conventions
            .OfType<IncludeMetadataConvention>().ToArray());
    }

嗯 - 我可以确保我所说的就是我所做的...我很好地遵循了那个指南 - 修改了出现异常的模型,然后不是放弃/编写他们建议的脚本,而是添加了该列,结果它正常运行。 - Wil
@Wil:有趣。我刚在控制台应用程序中也尝试了同样的方法,但手动向表格添加列并没有解决问题。 - Ladislav Mrnka
回顾一些我以前的问题...再次强调,我可以确保事件的顺序,但是你对此比我知道得多...肯定还有其他事情发生了。将其标记为答案,如果有时间/可以再次重现,则将来可能会取消标记。+1 谢谢 - Wil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接