我有一个像这样的代码优先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>
非常感谢您的帮助
答案 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)之前附加引用对象;
非常感谢国王,你的帖子帮了我很多。