陷入EF迁移的困境

时间:2013-06-06 01:38:39

标签: entity-framework ef-migrations

我以某种方式让我的EF5项目进入了一个无法继续的状态。

当我执行'update-database'时,我得到:

  

无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。   您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移。

好的,很好,所以我尝试'添加 - 迁移',我得到:

  

由于以下显式迁移未决,因此无法生成显式迁移:[]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

20 GOTO 10 ??

此时我该怎么做? (除了切换到NHibernate?)

7 个答案:

答案 0 :(得分:6)

对我有用的是:

  1. 将我的所有更改(先备份)恢复为已知良好状态。
  2. add-migration DummyMigration。这引起了我评论的一些虚假变化
  3. 调用update-database将迁移+元数据添加到[__MigrationHistory]表。
  4. 进行我需要的更改(来自我之前采用的代码的备份)。
  5. 执行正常的add-migration / update-database
  6. 不太理想,看看是否有更好的解决方案会很酷,但这对我有用。

答案 1 :(得分:1)

对我来说,问题是我们已经重命名了迁移2014123456_Initial.cs的命名空间。
但VS没有在其关联的2014123456_Initial.Designer.cs中重新生成名称空间。

一旦Designer.cs被更改为使用相同的命名空间,它就会重新开始工作。


(也将此作为回答here发布,因为两个问题都非常相似)

答案 2 :(得分:1)

我将Configuration.cs课程中的以下值从false更改为true

AutomaticMigrationsEnabled = true; 

App_Data 文件夹中,我重命名了我的项目数据库 - .mdf 结尾的文件(因此将创建一个新文件),并在包管理器控制台中我输入了以下命令:

<强>更新的数据库

之后,待处理的迁移顺利进行。

请注意,这对我有用,但如果这是最佳做法,我不是100%。无论如何,这个Entity Framework Code First迁移指南都说:

“如果您收到一个错误,表明某个表已经存在且无法创建,可能是因为您在删除数据库之后和执行update-database之前运行了该应用程序。在这种情况下,再次删除Movies.mdf文件并重试update-database命令。如果仍然出现错误,请删除迁移文件夹。“

同样关于AutomaticMigrationsEnabled = true;MSDN article, Data Points : A Code First Migrations Mystery: Solved告诉“迁移可以自动运行,这意味着将发现模型更改,并且将在数据库上创建和执行与更改相对应的迁移。所有这些在数据库初始化期间运行时发生。自动迁移对于简单的应用程序很方便,但你几乎无法控制它们。我通常不建议启用它们。当Code First将默认值切换为false时,我很高兴。“

答案 3 :(得分:0)

我在创建数据库中犯了错误

    using System.ComponentModel.DataAnnotations;
    using System.Globalization;
    namespace ProductsManager.Models
    {
        public class Product
        {
            public int ProductId { get; set; }
            public string Name { get; set; }
            public string Description { get; set; }
            public string Production { get; set; }
            public string Size { get; set; }
            public decimal<--- Price { get; set; }
            public string Barcode { get; set; }
        }
    }

添加迁移后初始化我实现并将代码更改为public int Price {get;组; } 做了相同的添加迁移DummyMigration并在迁移文件夹中创建了它 080372472_dummyMigration

namespace IdetityBeta.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class DummyMigration : DbMigration
    {
        public override void Up()
        {
            AlterColumn("dbo.Products", "Price", c => c.String());
        }

        public override void Down()
        {
            AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable:             false, precision:              18, scale: 2));
        }
    }
}

然后更新数据库和问题解决了

答案 4 :(得分:0)

我通过

解决了这个问题
  • 运行“Update-Database -Script -Force”
    • 请注意错误“无法更新数据库...”
    • 之前尝试的最后一次显式迁移
  • 使用上次尝试中记录的上一次迁移运行“Update-Database -Script -TargetMigration [lastmigration]”

然后我可以在脚本中运行并添加新的迁移。这是在EF6和Nuget 2.8上 - 当问题发布时它可能没有用。

答案 5 :(得分:0)

  1. Update-Database –TargetMigration <second_last_migration>
  2. Add-Migration <full_name_including_timestamp_of_last_migration>

    您需要包括时间戳记,以便迁移知道您要编辑现有迁移,而不是搭建新迁移。这将更新上一次迁移的元数据以匹配当前模型。

  3. Update-Database

来源https://docs.microsoft.com/en-gb/ef/ef6/modeling/code-first/migrations/teams#resolving-the-merge-conflict

答案 6 :(得分:0)

当您尝试与具有与迁移基础相同的迁移的合并时,可能会发生这种情况,因为即使该表存在,迁移模式之一也存在模型差异

要解决此问题,您可以做的是通过命令创建合并迁移

  

添加迁移-IgnoreChanges

后跟迁移名称

这将使用当前模型作为快照创建一个空迁移。因此,这将解决您的模型差异问题,并且您的表和模型将保持同步