为什么Code First迁移没有DataBase中存在的更新表?

时间:2016-06-26 21:04:23

标签: asp.net-mvc entity-framework-5 ef-migrations

我希望通过代码第一次迁移来更新数据库。例如我在上下文中有3个实体,在数据库中有1个表,当我运行程序并出现此错误时出现问题:已经有表。

迁移配置

position: absolute
top: 50%
left: 50%
transform: translate(-50%, -50%)

IdentityModel

 internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
       // AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(ApplicationDbContext context)
    {
        //  This method will be called after migrating to the latest version.


    }
}

任何帮助?

2 个答案:

答案 0 :(得分:3)

在调用更新数据库之前,您是否尝试使用Add-Migration "migration_name"?或者尝试使用Update-Database -Force

否则,我发现了一些可能有用的步骤:

  1. 删除项目中的现有Migrations文件夹,并从现有数据库中删除表__MigrationHistory。
  2. 从程序包管理器控制台运行enable-migrations命令。
  3. 运行add-migration命令以创建初始迁移。
  4. 删除Up()方法中的所有代码以进行初始迁移。
  5. 运行update-database命令将初始迁移应用于数据库。这不会对现有对象进行任何更改(因为Up()方法不包含代码),但它将现有数据库标记为已迁移到初始状态。
  6. 更改代码优先模型。
  7. 运行add-migration命令以创建新的迁移。新迁移的Up()方法中的代码仅包含对象模型的更改。
  8. 运行update-database命令将更改应用于您的数据库。

答案 1 :(得分:0)

这是迁移的常见问题。添加新迁移时,它会将当前代码模型与先前迁移中存储的先前代码模型进行比较。如果这是第一次迁移,它将为所有内容生成代码,因此有时代码会尝试添加已存在的对象。

为了解决这个问题,你可以在迁移的Up()方法中注释掉已经存在的项目的代码,然后应用迁移(update-database)。现在它将正确生成前进的更改。

为防止这种情况发生,您应始终生成数据库的初始快照,而不会产生任何更改:

add-migration MyStartingPoint -IgnoreChanges  // ignorechanges flag tells EF to just take snapshot with no code in Up()

以下是有关迁移如何运作的文档"under the hood".