。净

除此之外,我的模型还包含在初始创建和迁移后添加到模型类中的两个属性。

public sealed class SomeModel
{
    ... other properties, which are fine.        
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

我最近的迁移包含:

public override void Up()
{
    ... other table being created.
    AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
    AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}

目标数据库包含PropertyOnePropertyTwo列, __MigrationHistory表包含创建表的迁移和添加列的迁移的条目。

当我运行Add-Migration来获得其他更改时,它也会再次包含这两个属性:

public override void Up()
{
    ... other changes.
    AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
    AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}

什么可能导致这个? 我还注意到,如果我恢复所有模型更改并尝试Update-Database (它应该什么也不做),我得到的错误:

无法更新数据库以匹配当前模型,因为有未决的更改并且自动迁移已禁用。 将挂起的模型更改写入基于代码的迁移或启用自动迁移。 将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。

什么可能导致这个?


事实证明,与迁移相关的.designer.cs类中存在模型的隐藏快照。 (这是IMigrationMetadata.Target ,不可读。)导致问题的一系列步骤是:

  • 创建对模型的更改。
  • 运行“ Add-Migration迁移”为更改创建迁移。 (这会创建隐藏的IMigrationMetadata.Target值。)
  • 注意到迁移模型存在错误,请直接更改模型类和迁移类。 ( IMigrationMetadata.Target值现在不同步。)
  • 运行Update-Database以应用更改。
  • 要摆脱困境,请使用Add-Migration Dummy创建虚拟迁移,然后从Up()Down()方法中删除所有内容。

    请注意, Add-Migration确实会提醒您这一点; 当你运行Add-Migration ,它显示:

    此迁移文件的设计器代码包含当前Code First模型的快照。 此快照用于在您为下一次迁移脚手架时计算对模型所做的更改。 如果您对要在此迁移中包含的模型进行其他更改,则可以通过再次运行“添加迁移虚拟”来重新搭建它。

    直到我找出问题出在什么地方,并且看到隐藏的IMigrationMetadata.Target值,警告才没有任何意义。

    底线:不要手动让您的模型和迁移Up()方法保持同步; 您必须重新运行Add-Migration才能正确设置隐藏值。


  • 将迁移代码复制到记事本或某些文本编辑器中
  • 删除您的问题迁移不起作用
  • Add-Migration YourMigrationName
  • 粘贴在您的文本编辑器中保存的迁移代码中
  • Update-Database
  • 在我看来,这是一种丑陋的工作,但这是我发现确保我的迁移具有所有变化的唯一方式。 我的猜测是实体框架在一段时间之后发生迁移,所以你必须创建一个新的。

    链接地址: http://www.djcxy.com/p/90251.html

    上一篇: .net

    下一篇: Web.config configuration for EF Migrations