已删除数据库和迁移文件,无法进行新迁移也无法恢复旧迁移,现在怎么办?

Deleted database & migration file, can't make new migrations nor revert old migrations, what now?

我的 ASP.NET 核心应用程序的工作流程:每当我进行影响数据库的更改时,我都会恢复旧的迁移,进行新的迁移,然后应用它。因为这仍处于早期开发阶段,所以我认为不要用大量迁移文件污染项目是有意义的。通常我称这个临时迁移文件为Initial,希望其中一个真正成为初始迁移文件

因此,我的 Data/Migrations 子文件夹中通常有 3 个文件:

因此,如果我没记错的话,我将在此工作流程中键入的命令如下所示:

Update-Database CreateIdentitySchema
Remove-Migration
Add-Migration Initial
Update-Database

这次我犯了一个错误...我不记得到底发生了什么,我输入了一些不正确的东西而不是上面的命令然后我傻到 (a) 手动删除 Initial迁移文件和 (b) 删除数据库足以从头重新启动测试数据库。

我错了

我希望 Add-Migration Initial 会创建一个与模型当前状态相对应的有效迁移文件,随后 Update-Database 会重新创建数据库。相反,这是发生了什么:

PM> Add-Migration initial
Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 3.0.0 initialized 'ApplicationDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
The name 'initial' is used by an existing migration.

???真的吗?好吧,让我们尝试删除此迁移:

Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 3.0.0 initialized 'ApplicationDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
No file named '20190727172711_initial.cs' was found. You must manually remove the migration class 'initial'.
System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.EntityFrameworkCore.Design.Internal.CSharpHelper.Literal(String value)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GeneratePropertyAnnotations(IProperty property, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateProperty(String builderName, IProperty property, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateProperties(String builderName, IEnumerable`1 properties, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityType(String builderName, IEntityType entityType, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityTypes(String builderName, IReadOnlyList`1 entityTypes, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.Generate(String builderName, IModel model, IndentedStringBuilder stringBuilder)
   at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGenerator.GenerateSnapshot(String modelSnapshotNamespace, Type contextType, String modelSnapshotName, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force, String language)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.RemoveMigration(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigrationImpl(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigration.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Object reference not set to an instance of an object.

????我必须手动删除迁移 class ??此迁移在哪里 class?

让我们在项目目录中进行一些文本搜索...显示的唯一有趣的文件是 myprojectname.csproj,其中我有这样的东西:

    <Compile Remove="Data\Migrations190412182930_initial.cs" />
    <Compile Remove="Data\Migrations190412182930_initial.Designer.cs" />
    <Compile Remove="Data\Migrations190628205310_initial.cs" />
    <Compile Remove="Data\Migrations190628205310_initial.Designer.cs" />
    <Compile Remove="Data\Migrations190720205411_initial.cs" />
    <Compile Remove="Data\Migrations190720205411_initial.Designer.cs" />
    <Compile Remove="Data\Migrations190720205837_initial.cs" />
    <Compile Remove="Data\Migrations190720205837_initial.Designer.cs" />

我认为这与此处无关(数字字符串不匹配)。

我调查了 ApplicationDbCOntextModelSnapshot,但那里似乎没有这样的 class 叫做 initial...

现在怎么办?如何进行?

如果您删除了数据库,那就很容易了。删除迁移文件夹。

然后运行

  • add-migration Initial
  • update-database

此外,我倾向于从项目文件中删除任何 <Compile Remove="" />