实体框架:添加迁移失败,无法更新数据库

Posted

技术标签:

【中文标题】实体框架:添加迁移失败,无法更新数据库【英文标题】:Entity Framework: Add-Migration fails with Unable to update database 【发布时间】:2013-04-02 13:22:23 【问题描述】:

我在一个项目(VS2012 Express 中的 ASP.NET MVC)中使用 Entity Framework (5.0) 已经有一段时间了。不过,现在我无法再添加迁移。

PM > Add-Migration -projectName MyProject.DAL TestMigration
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.

我不知道这是否提供任何线索,但“无法...”文本显示为红色。

我尝试启用自动迁移(这没有任何意义,因为我试图将挂起的模型更改写入基于代码的迁移),这会导致在数据库中进行所需的迁移。然而,这不是我想要的,因为我在项目中没有迁移。

我已尝试删除数据库并重新创建数据库。重新创建了数据库(直到上一次迁移),但是当我尝试使用 Add-Migration 时,我仍然收到“无法更新..”错误。

编辑

我尝试了 -force 参数但没有任何区别。

我的配置类的内容(上次迁移后我没有改变任何东西):

    public Configuration()
    
        AutomaticMigrationsEnabled = false;
    

    protected override void Seed(Bekosense.DAL.Context.BekosenseContext context)
               
        context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageDrop);
        context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageCreate); 
        context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentDrop);
        context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentCreate); 
        context.Database.ExecuteSqlCommand(Properties.Resources.AddDbUsers);
    

编辑 2 当我在我的 DbContext 中注释以下行时,我发现我能够进行添加迁移:

//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());

当我让上面的行保持活动状态并注释掉配置文件中的所有内容时,它仍然无法正常工作。 为什么 Database.SetInitializer 行会导致这种奇怪的行为?

【问题讨论】:

您能否发布您的配置文件以进行迁移? 你试过-force参数了吗? 我遇到了同样的问题,下面的 swapneel 的回答对我有用,尽管它有点极端。幸运的是我还处于起步阶段,所以没什么大不了的 【参考方案1】:

从不使用自动迁移,这在过去给我带来了问题(向下迁移数据库时,从一开始就使用正确的方法!)

这一行应该在你的 global.asax 中:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());

而不是在您的 DbContext 中!

如果上述方法没有帮助的其他提示:

也许您的应用程序中有多个层:

Add-Migration 000  -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration"  -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose

上面是我用于多层应用程序的 Add-Migration 命令。

数据库更新也是如此

Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script

【讨论】:

【参考方案2】:

您可以重置实体框架来解决您的问题[但请记住,它会将迁移带入默认状态]

注意:在执行以下操作之前进行备份

你需要删除当前状态:

删除项目中的迁移文件夹 删除数据库中的 __MigrationHistory 表(可能在系统表下)

您会在您的数据库中找到 __MigrationHistory 表 [在 App_Data 文件夹下]

然后在包管理器控制台中运行以下命令:

Enable-Migrations -EnableAutomaticMigrations -Force

使用或不使用 -EnableAutomaticMigrations

最后,您可以运行:

Add-Migration Initial

This may also help you

【讨论】:

您可能会发现此相关答案很有帮助:***.com/a/17798015/97964 有时您需要进行第二次迁移,或者您需要禁用在Initial 迁移中生成的代码。这里的关键是按照初始迁移的顺序获取数据库的元数据,然后从那里开始。 应该是答案。【参考方案3】:

在我的情况下,我遇到了同样的错误,因为我在迁移期间在构造函数方法中强制 ObjectContext.CommandTimeout 对类 DbContext。

尝试删除它

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;

【讨论】:

这很奇怪,但这也发生在我身上。 你救了我的一天,先生【参考方案4】:

这对我有用:

update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database

【讨论】:

我对 EF 来说显然太陌生了,无法理解解决方案。这是建议使用“添加迁移”的第二篇文章,但是......我在哪里输入这个? 您在 Visual Studio 的“包管理器控制台”中执行此操作。查看命令列表:coding.abel.nu/2012/03/ef-migrations-command-reference

以上是关于实体框架:添加迁移失败,无法更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架6代码首先用oracle更新实体

在 WCF 数据服务应用程序中迁移实体框架 6 和 VS2013 后无法更新或删除

如何使用 .net 核心实体框架迁移更新表(而不是重新创建它们)

实体框架核心更新-数据库特定迁移

实体框架数据库错误

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败