0

次のクラスの場合:

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 を実行しました)、最初の移行ファイルで問題のある行を確認できました。

またはもちろん私はそれらを修正しましたが、問題は解決したようです。

4

2 に答える 2

-1

Id列に属性を付けることができます

public Car 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Brand {get; set; }
}
于 2015-02-20T11:18:58.023 に答える