如何正确地将对象添加到上下文处理重复项?

时间:2013-03-05 17:58:53

标签: c# entity-framework entity-framework-4

我正在使用Entity Framework 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; }
   }
}

现在,假设我有2个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的新手。我想这是一个典型的事情,并且有一个习惯用于处理对象已经存在的对象插入。

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

1 个答案:

答案 0 :(得分:2)

你可以做一个简单的测试来查看数据库中是否已经存在,最简单的一个是查看Id是否为0.这是因为一旦将A添加到数据库中,就会向您的实体提供一个Id 。那时,您应该重新附加它而不是重新添加它

示例:

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

   dbContext.SaveChanges();
}