我正在使用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的新手。我想这是一个典型的事情,并且有一个习惯用于处理对象已经存在的对象插入。
如何有效地向上下文添加新对象,同时避免添加重复项?我应该捕获重复的异常并忽略它吗?有没有更好的检查方法?
答案 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();
}