【问题标题】:EF Migration object already exists errorEF 迁移对象已存在错误
【发布时间】:2016-11-02 20:52:11
【问题描述】:

我正在使用实体框架开发一个 ASP.NET MVC 项目,代码首先来自数据库。我得到数据库中每个表的模型。我对模型进行了一些更改,启用了迁移,当我初始化迁移时出现错误:

数据库中已经有一个名为“TableName”的对象。”

我尝试使用update-database -force,但没有帮助。初始迁移会创建已经存在的表!

如何使初始迁移应用模型上的更改而不是从头开始创建表?

在这种情况下,在数据库和模型之间同步更改的最佳做法是什么?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework ef-code-first


    【解决方案1】:

    如果这些答案都不适合您,您可以检查您的代码中是否使用了该方法

    context.Database.EnsureCreated()
    

    请注意,该方法不会应用任何迁移 (source)(你可以检查这个,对数据库进行 sql 查询,比如“select * from __EfMigrationHistory”,并确保该数据库上没有迁移。

    EF 提供了一个非常好的方法来帮助解决这个问题

    context.Database.Migrate()
    

    它不仅可以确保您拥有数据库,还可以使用迁移并将您的数据库迁移到最新版本。

    希望对你有帮助

    【讨论】:

    • 你的答案是关于DotNetCore,但他/她正在寻找ASP.NET MVC FW
    【解决方案2】:

    当您删除以前的迁移并且您的新迁移尝试创建已存在的新表时,会出现此错误。恢复之前的迁移,一切都会好起来的。

    【讨论】:

    • 如何恢复以前的迁移?
    【解决方案3】:

    对我来说最好和工作的想法是注释初始迁移文件的 UP 和 Down 函数中的所有代码,然后触发 dotnet ef database update 这应该可以正常工作,请确保在注释掉初始迁移之前更新迁移

    【讨论】:

    • 它对我有用,但dotnet ef database update
    • @Maxime 谢谢我更新了答案是愚蠢的错误
    【解决方案4】:

    Amr Alaa 解决方案有效,但数据库没有迁移到最新模型。

    这是它的工作原理(使用自动迁移):

    1. 删除迁移文件夹
    2. 执行启用迁移
    3. 在新创建的 Configuration.cs 中将这两个属性设置为 true

      public Configuration()
      {
          AutomaticMigrationsEnabled = true;
          AutomaticMigrationDataLossAllowed = true;
      }
      
    4. 执行更新数据库-Force

    您的数据库将更新为最新方案并准备就绪。

    希望这会有所帮助。

    【讨论】:

    • Enable-Migrations 已过时。
    • 您是否需要在此创建自己的构造函数例如Configuration?,甚至AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; 都没有解决,如何解决这些问题?
    【解决方案5】:

    尝试运行

    Add-Migration InitialCreate –IgnoreChanges 
    

    包管理器控制台中的命令。这会创建一个以当前模型作为快照的空迁移。然后运行

    Update-Database 
    

    包管理器控制台中的命令。这会将 InitialCreate 迁移应用到数据库。由于实际迁移不包含任何更改,它只会在 __MigrationsHistory 表中添加一行,表明该迁移已被应用。

    this

    然后更改您的模型并添加迁移。

    另一种方法是简单地在 up 和 down 方法上注释所有代码

    【讨论】:

    • 如果我在 SqlServer Management Sdutio 中对数据库进行更改,有什么方法可以同步模型?
    • 我认为你需要像在数据库优先方法中那样重新生成模型
    • 是的 @Arianit 简单地删除连接字符串删除上下文模型使用数据库中的代码优先模型重新生成具有相同上下文名称的类,你很好去;)。
    • 在开始执行此操作之前,请注意您并没有在连接字符串中输入错误的数据库名称。
    • Add-Migration : 找不到与参数名称“IgnoreChanges”匹配的参数。
    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2014-07-10
    • 2012-11-18
    相关资源
    最近更新 更多