【问题标题】:EF 7 Migration to Existing DatabaseEF 7 迁移到现有数据库
【发布时间】:2019-05-09 06:43:29
【问题描述】:

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

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

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

运行以下命令后:

dnx ef database update [Migration]

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

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

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

谢谢 赛义德

【问题讨论】:

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


    【解决方案1】:

    在 EF6 中,您将使用 -IgnoreChanges 标志运行迁移,它会在没有任何 Up() 代码的情况下拍摄模型的快照。如here. 所示,EF 7(EF Core)缺少此功能@

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

    【讨论】:

      【解决方案2】:

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

      我的步骤如何运作?

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

      如何解决?

      1. 删除数据库项目中的所有迁移和快照
      2. 删除现有数据库中的 __EFMigrationsHistory 表(如果存在)
      3. 在包管理器控制台中运行:

      运行前注意:此代码将在 Data 文件夹中创建现有数据库的新上下文和模型,因此不要忘记检查您的项目中是否有 Data 文件夹。

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

      1. 在包管理器控制台中运行:

      运行前注意:使用 Data 文件夹上下文为初始数据库创建第一个迁移(OldDataBaseContext 位于步骤 2 创建的 Data 文件夹内)

      添加-迁移初始-Context OldDataBaseContext

      1. 删除步骤 3 中创建的初始迁移中 Up 方法中的所有代码
      2. 在包管理器控制台中运行:

      运行前注意:使用 Data 文件夹上下文更新数据库(OldDataBaseContext 位于步骤 2 创建的 Data 文件夹内)

      Update-Database -Context OldDataBaseContext

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

      运行前注意:为具有新数据库更改的主上下文添加迁移

      添加-迁移新更新

      1. 运行:

      更新数据库

      我希望这对某人有所帮助。

      【讨论】:

      • 除了以上 10 个步骤,如果你想保留 DB 方案(以防你需要从头开始创建现有的 DB 方案)- 你也可以在包管理控制台中运行 Script-Migration 来生成从头开始创建现有数据库模式的原始 SQL 脚本。
      【解决方案3】:

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

      否则,我建议您使用迁移创建空数据库并使用 sql insert into ... select 命令从旧数据库中复制数据。没有这个,你以后升级数据库时会收到异常——例如更改索引会导致DropIndexCreateIndex迁移命令,DropIndex会失败,因为没有同名的索引(索引与其他索引存在,pre -EF7 名称)。

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

      【讨论】:

      • 是的,这就是我所做的——尽管为了纠正索引问题,我使用 RedGates Sql Compare 来管理班次(尽管你可以很容易地使用 Visual Studio SSDT 工具和架构比较)
      猜你喜欢
      • 1970-01-01
      • 2021-01-16
      • 2022-09-29
      • 2023-02-08
      • 2017-05-02
      • 2017-08-03
      • 2018-06-19
      • 2019-08-03
      • 1970-01-01
      相关资源
      最近更新 更多