删除了数据库和迁移文件,无法进行新迁移或还原旧迁移,现在该怎么办?



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

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

  • 00000000000000_CreateIdentitySchema.cs,它是很久以前由项目模板为我提供的
  • somenumbers_Initial.cs
  • ApplicationDbContextModelSnapshot.cs

所以如果我没记错的话,我会在这个工作流中键入的命令看起来是这样的:

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.

我必须手动删除迁移类??这个迁移类在哪里?

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

<Compile Remove="DataMigrations20190412182930_initial.cs" />
<Compile Remove="DataMigrations20190412182930_initial.Designer.cs" />
<Compile Remove="DataMigrations20190628205310_initial.cs" />
<Compile Remove="DataMigrations20190628205310_initial.Designer.cs" />
<Compile Remove="DataMigrations20190720205411_initial.cs" />
<Compile Remove="DataMigrations20190720205411_initial.Designer.cs" />
<Compile Remove="DataMigrations20190720205837_initial.cs" />
<Compile Remove="DataMigrations20190720205837_initial.Designer.cs" />

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

我查看了ApplicationDbCOntextModelSnapshot,但那里似乎没有这样的类initial。。。

现在该怎么办?如何继续?

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

然后运行

  • add-migration Initial
  • update-database

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

最新更新