C# EF 6 Code First-整数主键-无法在列中插入值NULL

C# EF 6 Code First-整数主键-无法在列中插入值NULL,c#,entity-framework,code-first,auto-increment,entity-framework-migrations,C#,Entity Framework,Code First,Auto Increment,Entity Framework Migrations,我正在尝试将表的主键更新为整数自动递增Id 这是我的实体: public class Reservation { public int Id { get; set; } public ReservationStatus Status { get; set; } public string Name { get; set; } public string CustomerName { get; set; } ... } 这是我的onmodel创建方法:

我正在尝试将表的主键更新为整数自动递增Id

这是我的实体:

public class Reservation
{
    public int Id { get; set; }
    public ReservationStatus Status { get; set; }
    public string Name { get; set; }
    public string CustomerName { get; set; }

    ...
}
这是我的onmodel创建方法:

当我尝试插入新保留时(更新数据库后),会引发以下异常:

无法将值NULL插入表“xxxxx.dbo.Reservations”的列“Id”中

这是我在designer(visual studio 2015)的“属性”专栏中看到的内容:

“是身份”仍然是假的

我怎样才能解决这个问题


提前感谢

您无法向SQL Server中的现有列添加标识


建议的修复方法是创建一个新列。最好的方法是添加一个新的标识列,为其创建迁移,然后删除旧列并为其创建迁移。这样EF就不会尝试重命名旧列。

您不能在SQL Server中向现有列添加标识


建议的修复方法是创建一个新列。最好的方法是添加一个新的标识列,为其创建迁移,然后删除旧列并为其创建迁移。这样EF就不会只尝试重命名旧列。

您是否尝试将这些属性添加到
保留
-类中的
Id
-属性,而不是样式:
[DataMember,Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。您是否尝试删除表以强制重新创建?是的,仍然相同。我注意到,如果我删除了所有迁移,重新创建一个迁移,然后重新创建数据库标识规范,这与预期的一样。我希望避免重新创建数据库,因为已经有一个生产版本,我不会删除所有数据:(有什么建议吗?请尝试添加[Key],而不是重载ModelCreation)属性添加到主键,并查看其是否有效。这将有助于缩小可能出现的问题。您是否尝试将这些属性添加到
保留
-类中的
Id
-属性,而不是样式:
[DataMember,key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。您是否尝试删除表以强制重新创建?是的,仍然相同。我注意到,如果我删除所有迁移,请重新创建一次迁移,然后重新创建数据库标识规范,这与预期一致。我希望避免重新创建数据库,因为已经有生产版本,我不会删除所有数据:(有什么建议吗?请尝试将[Key]属性添加到主键中,看看是否有效,而不是重载ModelCreation。这将有助于缩小可能出现的问题。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        ...

        modelBuilder.Entity<Reservation>()
            .HasKey(e => e.Id)
            .Property(e => e.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        ...
    }
public partial class Reservations_AlterKey_Id_AutoIncrement : DbMigration
{
    public override void Up()
    {
        DropPrimaryKey("dbo.Reservations");
        AlterColumn("dbo.Reservations", "Id", c => c.Int(nullable: false, identity: true ));
        AlterColumn("dbo.Reservations", "CustomerTaxCode", c => c.String());
        AddPrimaryKey("dbo.Reservations", "Id");
    }

    public override void Down()
    {
        DropPrimaryKey("dbo.Reservations");
        AlterColumn("dbo.Reservations", "CustomerTaxCode", c => c.String(nullable: false, maxLength: 128));
        AlterColumn("dbo.Reservations", "Id", c => c.Int(nullable: false));
        AddPrimaryKey("dbo.Reservations", new[] { "Id", "DeviceId", "CustomerTaxCode" });
    }
}