0

我正在使用 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 实例列表并将其添加到数据库上下文中:

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

问题是我收到异常通知我插入了重复的对象。我环顾四周,发现处理实体修改和附件的事情,但我对 EF 还是很陌生。我想这是一个典型的事情,并且有一个习惯用法来处理对象已经存在的对象插入。

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

4

1 回答 1

2

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

例子:

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

   dbContext.SaveChanges();
}
于 2013-03-05T18:00:46.880 回答