1

POCO を使用してモデルを構築しました。データベースをシードすると、次のようになります。

'CSP.Models.Type_Color' 関係のプリンシパル エンドを特定できません。追加された複数のエンティティが同じ主キーを持つ場合があります

問題のモデルは次のとおりです。

public class Type
{
    [Key]
    [ScaffoldColumn(false)]
    public int TypeId { get; set; }

    [Required(ErrorMessage = "A Type Name is Required")]
    [Display(Name="Type")]
    public string Name { get; set; }

    public int ColorId { get; set; }
    public bool Other { get; set; }

    //Navigations
    [ForeignKey("ColorId")]
    public virtual Color Color { get; set; }
    public virtual List<Tools> tools { get; set; }

}

public class Color
{
    [Key]
    [ScaffoldColumn(false)]
    public int ColorId { get; set; }

    [Required(ErrorMessage = "A name is required")]
    public string Name { get; set; }

    public string Description { get; set; }

    //navigation
    public virtual List<Type> Types { get; set; }
}

提案を読んだ後に行ったマークアップのほとんど。

エラーが発生しているシードコードは次のとおりです。

var colors = new List<Color>
        {
            new Color{Name="Red"},
            new Color{Name="White"}
        };

            var types = new List<Type>
        {
            new Type{ Name="Hammer", Color = colors.Where(ws => ws.Name=="Red").Single()},
            new Type{ Name= "Electric", Color = colors.Where(ws => ws.Name=="Red").Single()}
        };

new List<Tool>
        {
            new Wine{ Maker= Maker.Single(v => v.Name=="HammerCo"), Type= types.Single(wt => wt.Name=="hammer")},
        }
        }.ForEach(a => context.Tools.Add(a));
            context.SaveChanges();

また、各値をコンテキストに追加して保存してみました。タイプエンティティを保存しようとした後、このエラーが発生しました:

[System.Data.SqlClient.SqlException] = {"INSERT ステートメントが FOREIGN KEY 制約 \"Type_Color\" と競合しました。データベース \"TestTools\"、テーブル \"dbo.Colors\"、列 'ColorId で競合が発生しました'.\r\nステートメントは終了しました。"}

私は何が欠けていますか?

4

1 に答える 1

7

何が起こっているかというと、すべてのオブジェクトが主キーのデフォルトの int 値 (0) を持っているということです。それらをコンテキストに追加すると、EF はこれを検出し、エラーをスローします (同じ型の 2 つのオブジェクトが同じキーを持つことはできません。この場合は 0 です。データベースの主キー フィールドが IDENTITY 列として設定されていると仮定します。 auto increment +1 on insert. これは奇妙に聞こえるかもしれませんが、挿入時に IDENTITY 値に置き換えられるオブジェクトのプレースホルダー ID を指定する必要があります。

new Color{ColorId = 1, Name="Red"},
new Color{ColorId = 2, Name="White"}
new Type{TypeId = 1, Name="Hammer", ...}
new Type(TypeId = 2, Name="Electric", ...}
于 2012-07-22T21:42:34.957 に答える