Entity framework 实体框架外键插入重复键
我有一个代码优先的EF模型,如下所示:Entity framework 实体框架外键插入重复键,entity-framework,insert,foreign-keys,duplicates,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 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();
}
我在第一次上下文中没有问题。保存更改。但当我尝试用相同的ACode
和引用添加b2时,我得到了
违反主键约束“PK_dbo.As”。无法在对象“dbo.As”中插入重复键。重复的键值为(A0)
我真的很困惑,所以如果有人能解释为什么在第二次调用context.SaveChanges()
时,EF试图插入新的实体而不是使用现有的实体,我会非常高兴
非常感谢您的帮助感谢King King的评论,我发现了两件事
首先,如果只分配了外键Id(而不是引用),我可以自动找到外键
而不是
var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;
第二,当您分配引用时,必须使用context.As.Attach(a)在context.Bs.Add(b2)之前附加引用对象
非常感谢king king您的帖子对我帮助很大。第一次保存更改后,A有一个Id值。由于在第二次调用中再次隐式添加相同的对象,因此会出现异常。您应该保持上下文打开或将A的状态设置为“已修改”。A没有Id,密钥应为代码。每当我想将实体B添加到数据库时,我不能有相同的上下文。我希望能够在任何时候将实体B添加到A,而不仅仅是在我将实体A插入数据库时。第二个上下文不了解A
,它假设应该添加A
,因此是例外。好的,我如何让第二个上下文知道A
是一个引用。如果我用int-Id
替换string-code
,它将自动工作
查看它是否有效。
var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;