2015-12-02 13 views
1

当SaveChanges失败时,如何处理或清除添加到数据库的项目。实体处理添加到数据库的项目,但SaveChanges失败

db.MyTable.Add(MyModel); 
db.SaveChanges(); 

如果db.SaveChanges()失败,会发生什么情况由db.MyTable.Add(MyModel)添加的数据?

我是否需要清除这些添加的项目?如果是这样如何?

当服务尝试更新我可能已手动删除的项目时,它会引发约束问题,因为它应该如此。

看来我需要撤销在这个问题后添加的这些项目,所以他们不会试图一遍又一遍地添加抛出相同的错误,因为它正在做。

+0

您可以从'DbContext' –

+0

分离插入实体难道他们只是继续增加,但不调用SaveChanges更新,如果我只是不停地拆卸它们或者是不是会这样呢? – Tsukasa

回答

1

你可以用你的SaveChanges()呼叫try...catch块中:

try 
{ 
    db.SaveChanges(); 
} 
catch (DbEntityValidationException ex) 
{ 
    foreach (DbEntityValidationResult item in ex.EntityValidationErrors) 
    { 
     DbEntityEntry entry = item.Entry; 

     //... 

     // Rollback changes 

     switch (entry.State) 
     { 
      case EntityState.Added: 
       entry.State = EntityState.Detached; 
       break; 
      case EntityState.Modified: 
       entry.CurrentValues.SetValues(entry.OriginalValues); 
       entry.State = EntityState.Unchanged; 
       break; 
      case EntityState.Deleted: 
       entry.State = EntityState.Unchanged; 
       break; 
     } 

    } 
} 

上面的代码检查DbEntityEntry的导致错误的State财产。如果当前状态为已添加,则更改为已分离。 或只是覆盖它。

或者您可以覆盖SaveChanges()调用并执行相同的操作。

+0

我会建立分离的条目吗?它会工作,或在捕获使用'db.MyTable.Remove(MyModel)'更好?或者这不会有什么区别? – Tsukasa

+0

在这种情况下,更改将被丢弃。因此,您可以给用户另一个机会进行更改,然后再次调用SaveChanges()。 –

+0

不得不将其更改为DbUpdateException,将监视内存使用情况,以确保它的工作。 – Tsukasa

相关问题