C# EF 6 Code First-整数主键-无法在列中插入值NULL
我正在尝试将表的主键更新为整数自动递增Id 这是我的实体: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创建方法:
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" });
}
}