实体框架外键插入重复键

时间:2015-10-17 10:51:41

标签: entity-framework insert foreign-keys duplicates

我有一个像这样的代码优先EF模型:

public partial class A
{
    [Key]
    [StringLength(7)]
    public string Code { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }


    public virtual ICollection<B> Bs { get; set; }
}

public partial class B
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    [StringLength(7)]
    [ForeignKey("A")]
    public string ACode { get; set; }

    public virtual A A { get; set; }
}

当我插入这样的数据时:

var a = new A();
a.Code = "A0";
a.Name = "A Name";

var b = new B();
b.Name = "B Name";
b.ACode = a.Code;
b.A = a;

using (DbContext context = new DbContext())
{
        context.As.Add(a);
        context.Bs.Add(b);
        context.SaveChanges();
}

var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;

using (DbContext context = new DbContext())
{
        context.Bs.Add(b2);
        context.SaveChanges();
}

我在第一次context.SaveChanges期间没有问题。但是当我尝试添加具有相同ACode的b2和参考时我得到

  

违反PRIMARY KEY约束'PK_dbo.As'。无法在对象'dbo.As'中插入重复键。重复键值为(A0)。

我真的很困惑,如果有人能解释为什么在第二次调用context.SaveChanges()时,EF会尝试插入新的A实体而不是使用已存在的实体,我会很高兴。< / p>

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

感谢King King的评论,我发现了两件事。

首先,如果只分配了外国ID(不是参考),我可以自动查找外键。

await Task.WhenAll(x.Select(...))

而不是

var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;

第二,当您分配引用时,您必须使用context.As.Attach(a)在context.Bs.Add(b2)之前附加引用对象;

非常感谢国王,你的帖子帮了我很多。