即使实体框架的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个对象出现错误,那么其他对象都会出现错误。
我同意@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();