我有一个模型类,当我创建初始迁移时,我最初省略了DatabaseGenerationOption.Identity
。课程如下:
public class Hospital
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int HospitalID { get; set; }
[Display(Name="Hospital Code")]
[StringLength(50)]
public string HospitalCode { get; set; }
[Display(Name = "Hospital Name")]
[StringLength(200)]
public string HospitalName { get; set; }
}
当我运行dotnet ef database update
时,收到以下错误:
Executed DbCommand (60ms) [Parameters=[], CommandType='Text',
CommandTimeout='30']
SELECT OBJECT_ID(N'__EFMigrationsHistory');
Executed DbCommand (1ms) [Parameters=[], CommandType='Text',
CommandTimeout='30']
SELECT OBJECT_ID(N'__EFMigrationsHistory');
Executed DbCommand (2ms) [Parameters=[], CommandType='Text',
CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
Applying migration '20170423214618_UpdateHospitalIdentity'.
System.InvalidOperationException: To change the IDENTITY property of a
column, the column needs to be dropped and recreated.
at
Microsoft.EntityFrameworkCore.Migrations.
SqlServerMigrationsSqlGenerator.Generate(AlterColumnOperation operation,
IModel model, MigrationCommandListBuilder builder)
at
Microsoft.EntityFrameworkCore.Migrations.
MigrationsSqlGenerator.Generate(MigrationOperation operation, IModel model,
MigrationCommandListBuilder builder)
at Microsoft.EntityFrameworkCore.Migrations.
MigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
at Microsoft.EntityFrameworkCore.Migrations.
Internal.Migrator.GenerateUpSql(Migration migration)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String
targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.
MigrationsOperations.UpdateDatabase(String targetMigration, String
contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.
<>c__DisplayClass0_1.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.
OperationBase.Execute(Action action)
To change the IDENTITY property of a column, the column needs to be dropped
and recreated.
我看到迁移创建了一个AlterColumn方法,如下所示:
public partial class UpdateHospitalIdentity : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<int>(
name: "HospitalID",
table: "Hospital",
nullable: false,
oldClrType: typeof(int))
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<int>(
name: "HospitalID",
table: "Hospital",
nullable: false,
oldClrType: typeof(int))
.OldAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
}
}
更新
我尝试执行dotnet ef migrations remove
,意图删除InitialCreate迁移。但是,由于我在InitialCreate迁移后运行update database
,因此收到以下内容:
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:04.18
Executed DbCommand (55ms) [Parameters=[], CommandType='Text',
CommandTimeout='30']
SELECT OBJECT_ID(N'__EFMigrationsHistory');
Executed DbCommand (4ms) [Parameters=[], CommandType='Text',
CommandTimeout='30']
SELECT [MigrationId], [ProductVersion]
FROM [__EFMigrationsHistory]
ORDER BY [MigrationId];
The migration '20170419050810_InitialCreate' has already been applied to the
database. Unapply it and try again. If the migration has been applied to
other databases, consider reverting its changes using a new migration.
如何在EF Core迁移中删除表并使用预期的身份约束重新创建它?