0

テーブルのプライマリキーを整数自動インクリメントIDに更新しようとしています。EF 6コードファースト - 整数プライマリキー - カラムに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方法である:私は挿入しようとすると

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

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     ... 

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

     ... 
    } 

これは、生成された移行であります新しい予約(更新 - データベースの後)次の例外i

カラム 'Id'、テーブル 'xxxxx.dbo.Reservations'に値NULLを挿入できません。

これは私がデザイナー(Visual Studioの2015)から列のプロパティで見たものである。

enter image description here

は "アイデンティティです" まだfalseです。

どうすればこの問題を解決できますか?あなたは、SQL Serverの既存の列にIDを追加することはできません事前

+0

これらの属性を[Fluent](https://msdn.microsoft.com/en-us/data/jj591617.aspx)の代わりに 'Reservation'-classの' Id'プロパティに追加しようとしましたか?スタイル: '[DataMember、Key、DatabaseGenerated(DatabaseGeneratedOption.Identity)]'。レクリエーションを強制するためにテーブルを削除しようとしましたか? –

+0

はい、まだ同じです。すべての移行を削除すると、1回の移行を再作成してから、データベースのID仕様を再作成することが予期したとおりに行われることに気付きました。私はすでに生産バージョンが存在するのでデータベースを再作成することは避けたいと思います。私はすべてのデータを消去しません:(何か提案? – Androidian

+0

OnModelCreationをオーバーロードするのではなく、主キーに[Key]起こりうる問題を絞り込むのに役立ちます。 – Licht

答えて

4

感謝。

Adding an identity to an existing column

修正案は、新しい列を作成することです。最善の方法は、新しいID列を追加し、そのID列の移行を作成し、古い列を削除して移行を作成することです。このようにして、EFは古い列の名前を変更しようとしません。

関連する問題