我在循环外创建了实体对象。
在循环中创建并保存模型对象,如果由于截断错误导致任何对象无法保存,则现在介于其间,然后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个对象在列表中,那么只有第一个对象被保存,如果第二个对象发生错误,则所有给出错误。
答案 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();