Entity framework core EF 7迁移到现有数据库

Entity framework core EF 7迁移到现有数据库,entity-framework-core,entity-framework-migrations,asp.net5,Entity Framework Core,Entity Framework Migrations,Asp.net5,我正在使用ASP.NET5和EF7进行一个web项目 我已将现有数据库中的所有表导入到项目中的模型中。但是,我在迁移方面遇到了问题 我已经创建了初始迁移,对特定实体进行了一些更改,在我所做的更改之后创建了另一个迁移,现在希望将更改应用于数据库 运行以下命令后: dnx ef数据库更新[迁移] dnx正在尝试对数据库中已存在的所有实体应用“初始”迁移,这会导致如下错误: {数据库中已存在名为['EntityName']的对象。} 您能否就如何在现有数据库上进行迁移提供建议 谢谢 Saeed在EF6

我正在使用ASP.NET5和EF7进行一个web项目

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

我已经创建了初始迁移,对特定实体进行了一些更改,在我所做的更改之后创建了另一个迁移,现在希望将更改应用于数据库

运行以下命令后:

dnx ef数据库更新[迁移]

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

{数据库中已存在名为['EntityName']的对象。}

您能否就如何在现有数据库上进行迁移提供建议

谢谢
Saeed

在EF6中,您将使用
-IgnoreChanges
标志运行迁移,它将在不使用任何
Up()
代码的情况下拍摄模型快照。如图所示,EF 7(EF核心)中缺少此项


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

如果您坚信,新(EF7)数据库模式将与旧数据库模式匹配(包括索引和键名)-您可以运行“初始”迁移到空(临时)数据库,然后将
\u EFMigrationHistory
表从那里复制到您的真实数据库

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


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

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

我的步骤是如何工作的

当您有一个包含10个表的数据库,并且在tables中有您不想清除的数据时。在此之后,您将首先在代码中创建新模型并运行到现有数据库,您将得到错误“无效的对象名称'tableName'对于查询到新表,并且您希望创建迁移并将其更新到现有数据库,但第一次迁移将为旧表和新表创建所有查询,如果您运行更新数据库,您将获得“数据库中已经有一个名为['EntityName']的对象”。对于初始迁移

如何修复它

  • 删除数据库项目中的所有迁移和快照
  • 删除现有数据库(如果存在)中的_EFMigrationsHistory表
  • 在包管理器控制台中运行:
  • 运行前注意:此代码将为数据文件夹创建现有数据库的新上下文和模型,所以不要忘记检查项目中是否没有数据文件夹

    Scaffold DbContext“您的连接字符串” Microsoft.EntityFrameworkCore.SqlServer-OutputDir数据

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

    添加迁移初始上下文OldDataBaseContext

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

    更新数据库-上下文OldDataBaseContext

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

    添加迁移更新

  • 运行:
  • 更新数据库


    我希望这能帮助一些人。

    是的,我就是这么做的——尽管为了纠正索引问题,我使用了RedGates Sql Compare来管理轮班(尽管你也可以轻松地使用Visual Studio SSDT工具和模式比较)