次のクラスの場合:
public Car
{
public int ID { get; set; }
public string Brand {get; set; }
}
通常、私たちが行うとき:
Car c = new Car { Brand = "Jaguar" } ; // Point A
context.Cars.Add(c); // Point B
context.SaveChanges() // Point C
ポイント B では、ID は 0 のままにする必要があり、ID はポイント C でのみ割り当てる必要があります。
IDENTITY_INSERT が OFF に設定されている場合、テーブル 'Cars' の ID 列に明示的な値を挿入できません。
私は Fluent API を試してみましたが、関係が正しく定義されていることを 99% 確信しています。この DbSet がこのエンティティに ID を割り当てようとする理由がわかりません。
アップデート
ご協力いただきありがとうございます。ここに私の状況のより詳細な図を示します。
public Car
{
public int ID { get; set; }
public string Brand {get; set; }
public int Driver1ID {get; set;}
public Person Driver1 {get; set;}
public int Driver2ID {get; set;}
public Person Driver2 {get; set;}
}
public Person
{
public int ID { get; set; }
public string Name { get; set; }
}
そして、ここに私の流暢な構成があります:
modelBuilder.Entity<Car>().HasKey(x => x.ID);
modelBuilder.Entity<Car>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // Added following Igor's suggestion
modelBuilder.Entity<Car>().HasRequired(x => x.Driver1).WithOptional().WillCascadeOnDelete(false);
modelBuilder.Entity<Car>().HasRequired(x => x.Driver2).WithOptional().WillCascadeOnDelete(false);
編集 2
まあ、実際に移行が台無しになっていることがわかりました。何らかの理由で、EF は 2 番目の外部キー (Driver2) を主キー列に配置しました。これが、DbSet.Add() が実際には Driver 2 ID である値を ID 列に入力していた理由です。
なぜEFがそのように混乱したのか、私には本当にわかりません。奇妙なことに、SQL Management Studio を調べたときに、この FK が表示されませんでした。EF は、実際には DB にないいくつかの関係を適用したようです。
移行全体をリセットし (移行フォルダーと _migrationhistory テーブルを削除してから、PowerShell で Enable-Migrations と Add-Migration Init を実行しました)、最初の移行ファイルで問題のある行を確認できました。
またはもちろん私はそれらを修正しましたが、問題は解決したようです。