2013-06-27 25 views
0

让我说我有这样的代码;删除实体5.0上下文中的挂起更改?

using (DAL.MyContext db = new DAL.MyContext()) 
{ 
    foreach (var item in UpdatedValues) 
    { 
     try 
     { 
      switch (item.Status) 
      { 
       case Enums.Status.Delete: 
        //stuff 
        break; 
       case Enums.Status.Updated: 
        //stuff 
        break; 
       case Enums.Status.Added: 
        //stuff 
        break; 
      } 

      db.SaveChange(); //crashing here 
     } 
     catch(Exception ex) 
     { 
     tools.log(ex); 
     /* 
       how to remove the last action so the for each can continue? 
     */ 
     } 
    } 
} 

我想从上下文中删除上次更改。

为什么?

如果出现异常,下一次更改也会抛出异常,因为最后一次更改不起作用,但仍处于“上下文”中,因此它将尝试再次保存。

是可能的吗?

+0

这是一个有点难以unders你想要什么。该foreach将继续到UpdatedValues中的下一个项目。你可以发布更多的东西吗? –

+0

@JonnyPiazzi,我更新了我的问题 – Fredou

回答

0

除非有人发现这不是“正确”,这似乎解决了我的问题;

在catch

,与ILSpy看着5.0 System.Data.Entity.Internal.InternalEntityEntry.State版本之后,我需要的是

internal static void UndoContextChange(DB_Context db) 
    { 
     foreach (var item in db.ChangeTracker.Entries()) 
     { 
      if (item.State == System.Data.EntityState.Modified) 
      { 
       item.State = System.Data.EntityState.Unchanged; 
      } 
      else if (item.State == System.Data.EntityState.Deleted) 
      { 
       item.State = System.Data.EntityState.Unchanged; 
       item.CurrentValues.SetValues(item.OriginalValues); //just in case 
      } 
      else if (item.State == System.Data.EntityState.Added) 
      { 
       item.State = System.Data.EntityState.Detached; 
      } 
     }   
    } 
+0

那就是这样。 –

+0

@philsoady,现在我的问题是当抛出一个错误时,哪一个是最好的分离或者没有改变,detached会从Entries列表中移除该对象,同时保持它不变。 – Fredou

+0

取决于将来使用上下文内容。 find()将使用仍然附加的内容。 Local()仍将使用附加内容。 –

0

心不是一个分开方法:-( 但实体状态可以打赌改变 见枚举.. ..

// Type: System.Data.EntityState 
public enum EntityState 
{ 
Detached = 1, 
Unchanged = 2, 
Added = 4, 
Deleted = 8, 
Modified = 16, 
} 

//See 
Context.Entry(poco).State = state; 

否则刚刚续约的背景下,通常一个更好的方法呢。