如何正确地将对象添加到上下文处理副本
本文关键字:上下文 处理 副本 添加 对象 正确地 | 更新日期: 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();
}