错误播种数据库,外键问题

Sno*_*rnt 1 entity-framework ef-code-first

我用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; }
}
Run Code Online (Sandbox Code Playgroud)

我在阅读建议后做了大部分标记.

我收到错误的种子代码在这里:

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();
Run Code Online (Sandbox Code Playgroud)

我也尝试将每个值添加到上下文然后保存.尝试保存类型实体后出现此错误:

[System.Data.SqlClient.SqlException] = {"INSERT语句与FOREIGN KEY约束冲突\"Type_Color \".冲突发生在数据库\"TestTools \",table \"dbo.Colors \",列'ColorId '.\ r \n声明已被终止."}

我错过了什么?

cyg*_*nim 6

发生的事情是你的对象的主键都有默认的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", ...}
Run Code Online (Sandbox Code Playgroud)