如何正确地将对象添加到上下文处理副本

本文关键字:上下文 处理 副本 添加 对象 正确地 | 更新日期: 2023-09-27 18:02:15

我正在使用实体框架4.4,我有一个一对多的关系模型,像这样:

class A { 
   public int Id { get; set; }
   public virtual B { get; set; }
   public int BId;
}
class B {
   public Id { get; set; }
   private ICollection<A> _As;
   public virtual ICollection<A> As
   {
      get { return _As ?? (_As = new HashSet<A>()); }
      protected set { _As = value; }
   }
}

现在,假设我有两个A实例,它们都有相同的B实例。然后是这样(JSON表示):

A: { Id: 1, BId: 1, B: { Id: 1, As: [ 1, 2 ] } }
A: { Id: 2, BId: 1, B: { Id: 1, As: [ 1, 2 ] } }

我想循环通过我的A实例的当前列表,并添加到db上下文:

foreach (var a in LocalAList)
{ 
   dbContext.Add(a);
   dbContext.SaveChanges();
}

问题是我得到异常,告诉我插入了重复的对象。我环顾四周,发现了处理实体修改和附件的东西,但我对EF还是很陌生。我可以想象这是一个典型的事情,有一个处理对象插入的习语,对象已经存在了。

如何有效地向上下文添加新对象,同时避免添加重复的对象?我应该捕获重复异常并忽略它吗?有更好的检查方法吗?

如何正确地将对象添加到上下文处理副本

您可以做一个简单的测试来查看数据库中是否已经存在a,最简单的测试是查看Id是否为0。这是因为一旦A被添加到数据库中,就会给实体一个Id。此时,您应该重新连接它,而不是重新添加它

的例子:

foreach (var a in LocalAList)
{ 
  if (a.Id == 0)
    dbContext.Add(a);
   else 
    dbContext.As.Attach(a)
   dbContext.SaveChanges();
}