EF 7迁移到现有数据库

时间:2016-04-20 11:02:46

标签: entity-framework-core ef-migrations asp.net5

我正在使用ASP.Net 5和EF7开发一个Web项目。

我已将现有数据库中的所有表格导入到项目中的模型中。但是,我在迁移方面遇到了问题。

我创建了初始迁移,对特定实体进行了一些更改,根据我所做的更改创建了另一个迁移,现在想要在数据库上应用更改。

在下面运行此命令后:

dnx ef database update [Migration]

dnx正在尝试对已经在数据库中的所有实体应用“初始”迁移,这会导致如下错误:

  

{数据库中已有一个名为['EntityName']的对象。 }

请告知如何在现有数据库上进行迁移?

由于 赛义德

3 个答案:

答案 0 :(得分:7)

在EF6中,您将使用-IgnoreChanges标志运行迁移,它将拍摄模型的快照而不使用任何Up()代码。 EF 7(EF Core)缺少这一点,如here.

所示

现在的解决方法是从迁移的Up()代码中删除或注释掉现有数据库对象的代码,然后更新数据库。然后,后续迁移将仅包括更改。

答案 1 :(得分:3)

如果您坚信,新的(EF7)数据库架构将与您的旧数据库架构(包括索引和键名称)匹配 - 您可以运行“初始”迁移到空(临时)数据库,然后复制{{1}从那里到你的真实数据库。

否则,我建议您使用迁移创建空数据库,并使用sql __EFMigrationHistory命令从旧数据库中复制数据。如果没有这个,您将在以后升级数据库时收到异常 - 例如,更改索引将导致insert into ... selectDropIndex迁移命令,CreateIndex将失败,因为没有具有此名称的索引(索引与其他前EF7名称一起存在。

在我的项目中 - 旧的(来自EF6)和新的数据库方案是不同的,我使用了第二种选择。

答案 2 :(得分:2)

2天后,我找到了一种不在谷歌和互联网上的EFCore方式!

我的步骤如何运作?

如果您拥有一个包含10个表的数据库,并且您在平板电脑中有数据,而您不想清除数据。在此之后,您将首先在代码中创建新模型并运行到现有数据库并且您将收到错误"无效的对象名称' tableName'。"对于查询新表并且您想要创建迁移并将其更新到现有数据库,但是如果您运行update-database,第一次迁移将为旧表和新表创建所有查询"已经有一个名为[ ' EntityName']在数据库中。"对于您的初始迁移。

如何解决?

  1. 删除数据库项目中的所有迁移和快照
  2. 删除现有数据库中的__EFMigrationsHistory表(如果存在)
  3. 在程序包管理器控制台中运行:
  4. 运行前注意:此代码将创建现有数据库的新上下文和模型到Data文件夹,因此不要忘记检查项目中是否没有Data文件夹。

      

    Scaffold-DbContext"你的连接字符串"   Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data

    1. 在程序包管理器控制台中运行:
    2. 运行前注意:使用Data文件夹上下文创建初始数据库的第一次迁移(OldDataBaseContext位于由步骤2创建的Data文件夹中)

        

      Add-Migration initial -Context OldDataBaseContext

      1. 删除步骤3中创建的初始迁移内的Up方法中的所有代码
      2. 在程序包管理器控制台中运行:
      3. 运行前注意:使用Data文件夹上下文更新数据库(OldDataBaseContext位于由步骤2创建的Data文件夹中)

          

        Update-Database -Context OldDataBaseContext

        1. 删除在步骤2中创建的数据文件夹
        2. 转到快照和初始迁移类,并将已删除的上下文从Data文件夹更改为数据库项目中存在的主上下文(只需修复它以进行构建)
        3. 执行命令
        4. 运行前注意:为具有新数据库更改的主上下文添加迁移

            

          添加迁移newUpdate

          1. 执行命令
          2.   

            更新的数据库的

            我希望这有助于某人。