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帮了我很多。
我有一个这样的代码优先 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帮了我很多。