C# 即使实体框架的SaveChanges出现错误,仍继续在循环中添加对象
我在循环外部创建了实体对象 在循环中,创建并保存模型的对象,如果由于截断错误导致任何对象无法保存,则EF开始在每个对象上给出错误。我认为它引用了内存中的对象 代码是这样的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
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;