即使实体框架的SaveChanges出错,也要继续添加Object in Loop

时间:2013-02-20 15:35:20

标签: c# entity-framework

我在循环外创建了实体对象。

在循环中创建并保存模型对象,如果由于截断错误导致任何对象无法保存,则现在介于其间,然后EF开始在每个对象上给出错误。我认为它已经引用了内存中的对象。

代码是这样的

 Entity dbEntity = new Entity();
 foreach(obj in list)
 {
   try
    {
     //some changes in object
     dbEntity.AddObject(obj);
     dbEntity.SaveChanges(); //at this point error comes
     obj=null;  
    }
    catch(ex as exception)
    {

    }
 }

所以假设第一次运行的循环运行保存一切正常 当第二个对象出现时,它有一些超过字段长度的文本 它给出了错误 现在第三次obj文本较少,但是SaveChanges发生时,它会给出相同的错误截断文本 因此,如果50个对象在列表中,那么只有第一个对象被保存,如果第二个对象发生错误,则所有给出错误。

2 个答案:

答案 0 :(得分:0)

我同意@Deepesh认为吞下异常并非如此。它之所以给你错误,是因为dbEntity内部有两个列表。一个是“在记忆中”并保留你的变化,一个实际上是持久的。当您添加引发错误的项目时,它会阻止添加当前在内存中的任何内容。在这种情况下,您添加项目1,尝试保存,它的工作原理。您添加项目2并保存并失败。您添加项目3,现在项目2 项目3尝试保存,2再次失败,项目2 3不会保存。对于后续的循环运行也是如此。如果某些内容失败,可能会在尝试保存下一个项目之前将其从dbEnttity集合中删除。

答案 1 :(得分:0)

在catch块中实例化新上下文是可以接受的。

var context = new Context();
foreach (var obj in list)
{
    // do some stuff
    try
    {
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        // do some logging operation
        context.Dispose();
        context = new Context();
    }
}
context.Dispose();