10

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

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

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

在下面运行此命令后:

dnx ef database update [Migration]

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

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

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

谢谢赛义德

4

3 回答 3

10

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

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

于 2016-04-20T16:18:54.257 回答
8

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

我的步骤如何运作?

当您有一个包含 10 个表的数据库并且您在 tabales 中有不想清除数据的数据时。之后您将首先在代码中创建新模型并运行到现有数据库,您将收到错误“无效的对象名称'表名'。” 用于查询新表,您想创建迁移并将其更新到现有数据库,但如果您运行 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 文件夹内)

更新数据库-上下文 OldDataBaseContext

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

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

添加迁移新更新

  1. 跑:

更新数据库

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

于 2018-04-09T06:42:43.090 回答
3

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

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

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

于 2016-04-21T12:12:43.900 回答