Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将对象添加到正确处理重复项的上下文中?_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 如何将对象添加到正确处理重复项的上下文中?

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表示): 然后,我想循环查看当前的实例列表,并将添加

我使用的是实体框架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表示):

然后,我想循环查看当前的实例列表,并将添加到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();
}