【问题标题】: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 的回答对我有用,尽管它有点极端。幸运的是我还处于起步阶段,所以没什么大不了的

标签: entity-framework


【解决方案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

    【讨论】:

    • 您可能会发现此相关答案很有帮助:stackoverflow.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
    猜你喜欢
    • 2018-11-17
    • 2019-02-25
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2014-07-08
    • 2017-04-08
    • 2017-04-25
    相关资源
    最近更新 更多