Entity Framework 外键插入重复键

Entity Framework foreign key inserting duplicate key

我有一个这样的代码优先 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 时,我得到

Violation of PRIMARY KEY constraint 'PK_dbo.As'. Cannot insert duplicate key in object 'dbo.As'. The duplicate key value is (A0 ).

我真的很困惑这样做所以如果有人能解释为什么在第二次调用 context.SaveChanges() 时,EF 试图插入新的 A 实体而不是使用已经存在的实体,我会很高兴.

非常感谢您的帮助

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

首先是如果只分配了外键(不是引用),我可以自动找到外键。

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

而不是

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

其次,当您分配引用时,您必须在 context.Bs.Add(b2);

之前使用 context.As.Attach(a) 附加引用对象

非常感谢king king你post帮了我很多。