如何将EF迁移引入现有的成熟项目

时间:2019-10-25 10:40:18

标签: c# entity-framework ef-migrations

简而言之,我想做的是将迁移功能添加到成熟的项目中,并且总是使用sql手动处理更改。

已为我分配了一个使用Entity Framework的项目,但是所有数据库更改都是在不使用迁移的情况下手动完成的。

在引入新更改之前,我们将在代码中创建模型,使用新表更新上下文,然后使用Entity Framework PowerTools生成sql,然后手动更新数据库。

因此,今天我们有了一个完整的数据库,有了一个数据库上下文,以及精心制作的EntityTypeConfiguration类。因此,这是代码优先的情况,但是数据库已经存在。

挑战是我跑步

let route = this.router.config.find(r => r.path === '/erro');
route.data = {name: 'name' };
this.router.navigateByUrl('/error')

我陷入了一个完整的Up()函数中,该函数试图创建整个数据库

'Enable-Migrations'
'Add-Migration'

我想做的是在数据库中设置一个标志,指示当前状态为现状,并且仅当创建全新数据库时才使用当前的Up()函数。

之后,我希望对数据库的所有更改都可以由EF迁移处理。

这可能吗?以及如何?

预先感谢

1 个答案:

答案 0 :(得分:3)

选项1:创建从当前模型开始的迁移

您可以将–IgnoreChanges参数与Add-Migration命令一起使用:

Add-Migration MigrationName –IgnoreChanges

这将使用当前模型作为快照创建一个空迁移。

选项2:创建完全迁移,从头开始创建数据库,但是跳过某些数据库上的第一次迁移

实体框架使用__MigrationHistory表来跟踪已经执行的迁移。在数据库上执行第一次迁移时,它将被插入__MigrationHistory表中。下次调用Update-Database命令时,EF将查看__MigrationHistory表,并跳过已经应用于数据库的迁移。

要使特定数据库跳过第一次迁移,可以执行以下操作:

  1. 创建初始迁移:
Enable-Migrations
Add-Migration InitialCreate 
  1. 使用以下命令获取迁移脚本:
Update-Database -Script
  1. 删除上述脚本中的所有内容,但以下语句除外:
CREATE TABLE [__MigrationHistory]
INSERT INTO [__MigrationHistory] ...

并在数据库上执行这些语句。

现在,该数据库具有已应用InitialCreate迁移的信息,并且对该特定数据库进行的Update-Database的任何进一步调用都将跳过InitialCreate迁移。