0

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

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

4

2 回答 2

0

我同意@Deepesh 的观点,即吞下异常不是要走的路。它给你错误的原因是它dbEntity内部有两个列表。一种是“在内存中”并保存您的更改,另一种是实际持久化的。当您添加一个引发错误的项目时,它会阻止添加当前在内存中的任何内容。在这种情况下,您添加第 1 项,尝试保存并且它可以工作。您添加第 2 项并保存,但它失败了。您添加第 3 项,现在第 2项第 3 项尝试保存,第 2 项再次失败,第 2 项第 3 项未保存。后续循环运行也是如此。如果某事失败,也许在尝试保存下一项之前将其从 dbEntity 集合中删除。

于 2013-02-20T15:42:55.307 回答
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();
于 2019-12-06T13:59:03.360 回答