【问题标题】:Error Seeding Database, foreign key issue播种数据库错误,外键问题
【发布时间】:2012-07-21 02:34:51
【问题描述】:

我已经使用 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语句已终止。"}

我错过了什么?

【问题讨论】:

  • 您第二次拼写的“锤子”没有大写字母 H。除此之外,尝试将 ColorID 设为 int? (Nullable&lt;int&gt;)

标签: entity-framework ef-code-first


【解决方案1】:

发生的情况是您的对象都具有默认的 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", ...}

【讨论】:

  • 做到了!这看起来确实很奇怪,在我将颜色表添加到混合之前,它似乎会自动处理 ID,但强制它起作用。
  • 谢谢,您的回答帮助我用数据库上下文播种我的新数据库
  • 还有我!简单的两个表结构不需要这个技巧,但是当我添加更复杂的二级关系时,数据库上下文种子过程就失去了它的方式。
  • 这对我也有帮助!简单,但非常有效!谢谢!
猜你喜欢
  • 2014-03-01
  • 1970-01-01
  • 2017-05-05
  • 2014-10-22
  • 2020-04-04
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
相关资源
最近更新 更多