Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 即使实体框架的SaveChanges出现错误,仍继续在循环中添加对象_C#_Entity Framework - Fatal编程技术网

C# 即使实体框架的SaveChanges出现错误,仍继续在循环中添加对象

C# 即使实体框架的SaveChanges出现错误,仍继续在循环中添加对象,c#,entity-framework,C#,Entity Framework,我在循环外部创建了实体对象 在循环中,创建并保存模型的对象,如果由于截断错误导致任何对象无法保存,则EF开始在每个对象上给出错误。我认为它引用了内存中的对象 代码是这样的 Entity dbEntity = new Entity(); foreach(obj in list) { try { //some changes in object dbEntity.AddObject(obj); dbEntity.SaveChanges(); //at

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

在循环中,创建并保存模型的对象,如果由于截断错误导致任何对象无法保存,则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个对象,那么只有第一个对象被保存,如果第二个对象出现错误,那么其余所有对象都会给出错误。

我同意@Deepesh的观点,即吞下异常不是一条路。它之所以给您错误,是因为
dbEntity
内部有两个列表。一个是“在内存中”并保存您的更改,另一个是实际保存的。当您添加引发错误的项时,它会阻止添加内存中当前的任何内容。在本例中,您添加了项目1,尝试保存,它就可以工作了。添加项目2并保存,但失败。您添加了项目3,现在项目2和项目3尝试保存,项目2再次失败,项目2和项目3未保存。对于通过循环的后续运行也是如此。如果某项操作失败,在尝试保存下一项之前,可以将其从dbEnttity集合中删除。

可以在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();

也许这意味着有些事情出了严重的问题,你应该停止做你正在做的事情。一般来说,例外往往意味着这类事情。通常不鼓励接受任何异常并尝试愉快地继续。是的,我同意,但他们需要这样做,我希望rest对象在使用dbEntity.DeleteObject(obj)时获得savedincatch;