【问题标题】:Why Code First Migration No Update Table that Exist In DataBase?为什么代码优先迁移没有数据库中存在的更新表?
【发布时间】:2016-06-26 21:04:22
【问题描述】:

我想通过代码先迁移更新数据库。例如,我在 contex 中有 3 个实体,在数据库中有 1 个表,当我运行程序时出现问题并收到此错误:已经有表。

迁移配置

 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.


    }
}

身份模型

 public ApplicationDbContext() : base("DefaultConnection" )
    {
        Database.SetInitializer<ApplicationDbContext>(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Migrations.Configuration>());
    }

有什么帮助吗?

【问题讨论】:

  • 你能告诉我们确切的错误信息吗?
  • 是的,这是:数据库中已经有一个名为“TClientsAdmins”的对象。
  • 尝试将您的AutomaticMigrationsEnabled = false 设置为true

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


【解决方案1】:

在调用更新数据库之前,您是否尝试过使用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 命令将更改应用到您的数据库。

【讨论】:

    【解决方案2】:

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

    要解决这个问题,您可以在迁移的 Up() 方法中为已存在的项目注释掉代码,然后应用迁移(更新数据库)。现在它将正确地生成向前的更改。

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

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

    这是一份关于迁移如何运作的文档"under the hood".

    【讨论】:

    • 我应用了您的代码,但收到此错误:在程序集“ProjectName”中找不到迁移配置类型。 (在 Visual Studio 中,您可以使用包管理器控制台中的 Enable-Migrations 命令添加迁移配置)。
    • 假设您已启用迁移,接下来要检查的是您在包管理器控制台中选择了正确的项目。您需要选择存在迁移的项目或将参数添加到指向那里的命令。
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多