0

我試圖更新我的表的主鍵是一個整數自動增量ID。EF 6 Code First - 整數主鍵 - 不能將值NULL插入列

這是我的實體:

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

    ... 
} 

這是我OnModelCreating方法:

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" }); 
    } 
} 

當我嘗試插入新保留(在更新數據庫之後)以下異常i s拋出:

無法將值NULL插入到'Id'列'xxxxx.dbo.Reservations'列中;

這是我在列屬性看到設計師(視覺工作室2015年):

enter image description here

「是一種身份」 仍然是假的。

我該如何解決這個問題?

在此先感謝

+0

您是否嘗試將這些屬性添加到'Reservation'類中的'Id'屬性而不是[fluent](https://msdn.microsoft.com/zh-cn/data/jj591617.aspx)樣式:'[DataMember,Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]''。您是否嘗試刪除表格以強制進行娛樂? –

+0

是的,仍然是一樣的。我注意到,如果我刪除所有遷移,重新創建一個遷移,然後重新創建數據庫標識規範是預期的。我想避免重新創建數據庫,因爲已經有一個生產版本,我不會刪除數據:(任何建議? – Androidian

+0

而不是重載OnModelCreation,請嘗試添加[Key]屬性到您的主鍵,看看是否這是有效的,這將有助於縮小可能的問題。 – Licht

回答

4

您不能將標識添加到SQL Server中的現有列。

Adding an identity to an existing column

建議的修復是創建一個新列。最好的方法是添加新的標識列,爲其創建遷移,然後刪除舊列併爲其創建遷移。這樣EF不會嘗試重命名舊列。