EF在MigrationHistory中创建InitialCreate,然后打开迁移并且InitialCreate有一个新的MigrationId导致挂起的迁移问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF在MigrationHistory中创建InitialCreate,然后打开迁移并且InitialCreate有一个新的MigrationId导致挂起的迁移问题相关的知识,希望对你有一定的参考价值。

我有两个解决方案,没有迁移的基本解决方案(正在生产中,因此我无法擦除数据)现在我已经将其分支以设置迁移并进行一些模型更改。

首先,我需要在分支解决方案(第二个解决方案)上设置迁移,以便我可以应用模型更改,因此我:

所以我删除创建的数据库,因为我需要运行第一个解决方案来创建初始数据库设置(模拟实时)。

当我运行第一个解决方案时,它会在名为InitialCreate(201807061432030_InitialCreate)的MigrationsHistory表中创建一个已自动创建的条目。然后我在第二个解决方案上运行update-database,它可以很好地应用我的模型更改,尽管它们在InitialCreate MigrationId中存在差异。

我的第二个解决方案中的迁移条目(按照它们的创建顺序和它们在解决方案中的顺序): - 201807061257015_InitialCreate - 201807061315294_InitialBlank - 201807061323086_add_entity

运行第一个和第二个解决方案后,迁移历史记录表中的迁移条目:

1 | 201807061315294_InitialBlank 2 | 201807061323086_add_entity 3 | 201807061432030_InitialCreate

第二个解决方案运行正常,但是当我尝试添加任何数据时,我得到System.InvalidOperationException:'自创建数据库以来,支持'Context'上下文的模型已更改。考虑使用Code First Migrations来更新数据库。

我试图在第二个项目上创建另一个迁移,以确保它们没有未迁移的模型更改(它们不应该是)但我收到错误。由于以下显式迁移未决,因此无法生成显式迁移:[201807061257015_InitialCreate]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

我的问题:

  1. 如何解决MigrationId不匹配问题?由于第一个解决方案没有打开迁移,当我打开它们时(在第二个解决方案中)它会创建一个新的id。
  2. 异常System.InvalidOperationException:'支持'Context'的模型会被MigrationId不匹配抛出,或者有人能指出我为什么会发生这种情况?我已经看过这个错误,但我找到的解决方案似乎不起作用: 删除迁移历史记录表并不好,因为客户数据无法在生产中执行此操作。 我发现添加Database.SetInitializer(null)的另一个解决方案;到global.asax似乎没什么区别。
  3. 为什么我的迁移顺序在迁移历史记录表中应用后会有所不同?

提前致谢!

答案

我不确定这是否可行,但我想我可能需要手动删除第一个InitialCreate并编辑db条目以反映正确的InitialCreate。基于这个问题我刚刚找到了https://stackoverflow.com/a/13108243/3172635

我将不得不尝试这个星期一。

编辑:我首先尝试删除_MigrationHistory表中的InitialMigration条目,但这不起作用,因为它尝试再次应用InitialMigrations但不能因为表已经创建。所以我所做的是更新InitialIigration条目的MigrationId以反映它在新项目中的含义。

我使用的sql:SET MigrationId ='201807061257015_InitialCreate'WHERE MigrationId ='201807061432030_InitialCreate'

以上是关于EF在MigrationHistory中创建InitialCreate,然后打开迁移并且InitialCreate有一个新的MigrationId导致挂起的迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Database.Create 的对象名称“dbo.__MigrationHistory”无效;传入连接字符串时的EF6.02

解决ef第一次启动较慢

无法在Ntier结构中创建EF数据库

如何首先在 EF 代码中创建持久计算列?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何使用 EF 核心在 SQLite 中创建自动增量列?