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 会检测到这一点并引发错误(相同类型的两个对象不能具有相同的键,在这种情况下为 0。我假设您在数据库中的主键字段设置为 IDENTITY 列并且将插入时自动递增 +1。这听起来可能很奇怪,但您需要为您的对象提供占位符 ID,这些 ID 在插入时将替换为 IDENTITY 值。

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 回答