2009-10-08 60 views
2

在实体框架中,有几个条件在数据库级别处理,并作为Context.SaveChanges()的异常传递回EF。在一个循环中处理SaveChanges异常

如果您正在循环中创建新实体,您可以通过标准的“Try Catch”块来处理异常,但是如何从SaveChanges()队列中清除有问题的实体?

例如(移动的SaveChanges循环外没有积极的效果,因此,其在此示出的环内):

while(i < 1000) 
{ 
    MyEntity Wibble = new MyEntity(); 
    Wibble.Name = "Test " + i.ToString(); 

    Context.AddToTests(Wibble); 
    Context.SaveChanges(); 

} 

如果由于某种原因,已经存在一个维布勒这将导致插入物要在数据库中的唯一约束失败,我可以处理循环中的立即异常。

但是,它在下一次迭代中再次失败,因为有问题的Wibble实例仍然存在于SaveChanges队列中 - 你应该如何处理?

如果我们正在创建一个重复的Wibble,那么您可以事先检查,但这会导致两次往返数据库。我不介意处理这个例外,我只是想让这个问题知道,忽略这个记录并继续前进。

的思考?我做错了吗?

编辑:

我已经解决了眼前的问题,但只有当你在循环中做Context.SaveChanges()进行。如果你只是在循环结束之后调用SaveChanges()一次,我的解决方案不起作用 - 任何人都可以提出一种可行的替代方法吗?

+0

只需注释:您应该将更改保存在循环外部,因此您只有一次访问数据库而不是千次。 – RHAD 2014-04-08 11:01:20

回答

2

像往常一样,我有15分钟时间问别人之内解决它:)

的解决方案是从ObjectStateManager删除实体对象,同时处理异常,这使得循环继续:

while(i < 1000) 
{ 
    MyEntity Wibble = new MyEntity(); 
    Wibble.Name = "Test " + i.ToString(); 

    Context.AddToTests(Wibble); 

    try 
    { 
     Context.SaveChanges(); 
    } 
    catch 
    { 
     Context.ObjectStateManager.GetObjectStateEntry(Wibble).Delete(); 
    } 

}