C# 如何将对象添加到正确处理重复项的上下文中?
我使用的是实体框架4.4,我有一个一对多关系模型,如下所示:C# 如何将对象添加到正确处理重复项的上下文中?,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我使用的是实体框架4.4,我有一个一对多关系模型,如下所示: A类{ 公共int Id{get;set;} 公共虚拟B{get;set;} 公开招标; } B类{ 公共Id{get;set;} 私人收集; 公共虚拟ICollection As { 获取{return _As???(_As=new HashSet());} 受保护集{u As=value;} } } 现在,假设我有两个A实例,两个都有相同的B实例。然后我会有这样的东西(JSON表示): 然后,我想循环查看当前的实例列表,并将添加
A类{
公共int Id{get;set;}
公共虚拟B{get;set;}
公开招标;
}
B类{
公共Id{get;set;}
私人收集;
公共虚拟ICollection As
{
获取{return _As???(_As=new HashSet());}
受保护集{u As=value;}
}
}
现在,假设我有两个A实例,两个都有相同的B实例。然后我会有这样的东西(JSON表示):
然后,我想循环查看当前的实例列表,并将添加到db上下文中:
foreach (var a in LocalAList)
{
dbContext.Add(a);
dbContext.SaveChanges();
}
问题是,我收到异常通知,我插入了重复的对象。我环顾四周,发现了一些处理实体修改和附件的东西,但我对EF还是相当陌生。我认为这是一个典型的事情,并且有一个习惯用法用于处理对象已经存在的地方的对象插入
如何有效地向上下文添加新对象,同时避免添加重复对象?我是否应该捕获重复的异常并忽略它?有更好的检查方法吗?您可以做一个简单的测试,看看数据库中是否已经存在,最简单的方法是查看Id是否为0。这是因为一旦将A添加到DB中,就会为实体提供一个Id。此时,您应该重新附加它,而不是重新添加它 例如:
foreach (var a in LocalAList)
{
if (a.Id == 0)
dbContext.Add(a);
else
dbContext.As.Attach(a)
dbContext.SaveChanges();
}
Id
s数据库是否生成标识?你到底得到了什么例外?主键约束冲突的异常?(在这种情况下,我认为您不能拥有数据库生成的标识…)您到底想插入什么?只有A
s还是B
s?或者B
s是现有实体,而您只想在新a
s和现有B
s之间创建关系?请参见我的编辑。ID不是生成的身份。老实说,我现在不再回答了。为了对Mark Oreta的答案公平起见,您应该将您的编辑回滚到以前的版本,并用编辑编写一个新问题,或者在Mark Oreta的答案下写一条评论,说明您已经更改了您的问题,以便给他调整答案的机会。你的问题变化如此之大,以至于他的回答现在已经毫无意义了;看见
foreach (var a in LocalAList)
{
if (a.Id == 0)
dbContext.Add(a);
else
dbContext.As.Attach(a)
dbContext.SaveChanges();
}