已删除数据库和迁移文件,无法进行新迁移也无法恢复旧迁移,现在怎么办?
Deleted database & migration file, can't make new migrations nor revert old migrations, what now?
我的 ASP.NET 核心应用程序的工作流程:每当我进行影响数据库的更改时,我都会恢复旧的迁移,进行新的迁移,然后应用它。因为这仍处于早期开发阶段,所以我认为不要用大量迁移文件污染项目是有意义的。通常我称这个临时迁移文件为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.
????我必须手动删除迁移 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="" />
。
我的 ASP.NET 核心应用程序的工作流程:每当我进行影响数据库的更改时,我都会恢复旧的迁移,进行新的迁移,然后应用它。因为这仍处于早期开发阶段,所以我认为不要用大量迁移文件污染项目是有意义的。通常我称这个临时迁移文件为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.
????我必须手动删除迁移 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="" />
。