如何使用实体框架核心迁移向主键添加标识?

时间:2017-04-25 17:28:58

标签: c# asp.net-mvc entity-framework

我有一个模型类,当我创建初始迁移时,我最初省略了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迁移中删除表并使用预期的身份约束重新创建它?

0 个答案:

没有答案
相关问题