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

本文关键字:继续 循环 对象 添加 错误 框架 实体 SaveChanges | 更新日期: 2023-09-27 18:00:26

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

在循环中,创建并保存一个模型对象,此时,如果任何对象由于截断错误而无法保存,则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个对象,那么只有第1个对象被保存,如果第2个对象出现错误,那么其他对象都会出现错误。

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

我同意@Deepesh的观点,即接受异常不是解决问题的方法。它给出错误的原因是dbEntity内部有两个列表。一个是"内存中"的,保存您的更改,另一个是实际持久化的。当您添加一个引发错误的项时,它会阻止添加内存中当前的任何内容。在这种情况下,您添加项目1,尝试保存,它就工作了。您添加项目2并保存,结果失败。您添加了项目3,现在项目2项目3尝试保存,2再次失败,项目2和未保存。循环中的后续运行也是如此。如果某个项目失败,请在尝试保存下一个项目之前,将其从dbEntity集合中删除。

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