【发布时间】:2015-04-29 03:11:11
【问题描述】:
我对实体框架代码首次迁移有一个奇怪的问题。几个月来,我一直在项目中使用 EF 和代码优先迁移,并且一切正常。我最近创建了一个新的迁移,并且在运行 Update-Database 我的数据库的恢复备份时,我收到了这个错误:
支持上下文的模型已经改变,因为数据库是 创建的。考虑使用 Code First 迁移来更新数据库
迁移执行如下操作:
public override void Up()
{
using (SomeDbContext ctx = new SomeDbContext())
{
//loop through table and update rows
foreach (SomeTable table in ctx.SomeTables)
table.SomeField = DoSomeCalculation(table.SomeField);
ctx.SaveChanges();
}
}
我没有使用 Sql() 函数,因为 DoSomeCalculation 必须在 C# 代码中完成。
通常当我得到这样的东西时,意味着我已经以某种方式更新了我的模型并且忘记了创建迁移。然而,这一次并非如此。奇怪的是,我几天前创建的迁移中甚至没有发生错误,并且一直运行良好。
我看了quite 几个articles 关于this,他们似乎都在说电话
Database.SetInitializer<MyContext>(null);
这样做似乎可行,但我的理解(based on this article) 是这样做会消除 EF 确定数据库和模型何时不同步的能力。我不想这样做。我只是想知道为什么它突然认为它们不同步了。
我还尝试运行 Add-Migration 只是为了查看它对模型的看法是否发生了变化,但它不会让我这样做,说明我有待运行的迁移。不错的第 22 条记录,微软。
你猜到这里发生了什么?
我想知道上面列出的迁移使用 EntityFramework 是否是问题所在。似乎可能因为它不再是最新的迁移,所以当 EF 尝试创建一个 SomeDbContext 对象时,它会根据我当前的代码检查数据库(由于我们正在运行迁移,它还不是完全最新的)模型,然后抛出“上下文已更改”错误。
【问题讨论】:
-
什么版本的 EF,以及您的数据库备份有多长时间(即您希望它应用多少次迁移?)
-
所有迁移都是 EF 6.1.1-30610。备份中应该有大约 70 个,我的最新代码应该应用另外 3 个。
-
您的代码同时发生了什么变化?您是否引用了其他库?你的模型和你的程序在同一个程序集中吗?
-
我确实在模型中添加了一些新字段并生成了新的迁移。就是这样。没有其他重大变化。
-
嗯...我只是想到了一些事情。我在正在爆炸的迁移中使用 EF。它在尝试创建 DbContext 对象时失败。请记住,迁移不再是最新的迁移。是否有可能当 EF 进行该迁移时,它会根据当前版本的数据库(尚未完全更新,因为我们处于中间或正在运行迁移)检查代码模型的最新版本并抛出这个错误?这可以解释当它是最新的迁移时,它运行良好,现在不再运行。
标签: entity-framework entity-framework-migrations