2012-11-30 32 views
0

我想處理一個批量插入過程中的情況,其中可能存在具有相同主鍵的實體,這當然會導致SaveChanges拋出異常。分離一個實體並在另一次嘗試上保存上下文

這是我有:(計數隨着時間的foreach循環迭代次數下降)

try 
{ 
    _context.SaveChanges(); 
    _context.Dispose(); 
    _context = null; 
    _context = SelectContext<T>(); 
    _commitCount = 0; 
} 
catch (System.Data.UpdateException updateEx) 
{ 
    //Remove from _context all the entries that errored in the SaveChange() process... 
    if (updateEx.StateEntries != null) 
    { 
     foreach (ObjectStateEntry stateEntry in updateEx.StateEntries) 
     { 

      if ((System.Data.EntityState)stateEntry.Entity.GetType().GetProperty("EntityState").GetValue(stateEntry.Entity, null) != System.Data.EntityState.Detached) 
      { 
       _context.Detach(stateEntry.Entity); 
      } 
     } 

} 

//Save context changes again this time without erroneous entries... 
try 
{ 
    _context.SaveChanges(); 
    _context.Dispose(); 
    _context = null; 
    _context = SelectContext<T>(); 
    _commitCount = 0; 
} 
catch (Exception ex) 
{     
    //Welp, at the point, I'm clueless... 
} 

如果我看在ObjectStateManager,實體確實去除

但它仍然在第二次嘗試中拋出一個異常,喋喋不休地發出一聲嘟PK。

我認爲分離一個實體的原理是一樣的,如果它從來沒有在上下文中。我需要做其他事嗎?

謝謝。

+0

任何你不想檢查對象是否存在之前的原因? –

+0

究竟哪個對象? –

+1

你可以檢查實體是否存在於分貝之前添加?我認爲它比添加更好,並且在catch中分離 –

回答

0

這是我結束了我的情況做:

_context.ObjectStateManager.ChangeObjectState(stateEntry.Entity, System.Data.EntityState.Unchanged); 
_context.ApplyOriginalValues<T>(entityType, (T)stateEntry.Entity); 
_context.Detach(stateEntry.Entity); 

在那之後,我能夠保存環境的變化。

1

Deatch不能完全撤消更改。根據msdn文檔「只有實體被刪除;如果有任何相關對象被同一個ObjectStateManager跟蹤,那些將不會被自動分離。」

只有您傳遞給分離的實體被刪除。其他更改將導致失敗。會有爭奪你的分貝?如果這個應用程序是對數據庫進行更改的唯一方法,那麼您可以使用context.Refresh(RefreshMode.StoreWins, object);取消更改,否則它會更復雜一些。

你必須這樣做;

var entry = context.ObjectStateManager.GetObjectStateEntry(((IEntityWithKey)object).EntityKey); 

    for (int i = 0; i < entry.OriginalValues.FieldCount; i++) 

{ 

    entry.CurrentValues.SetValue(i, entry.OriginalValues[i]); 

} 

entry.AcceptChanges(); 

上面的代碼使用ObjectSateManager所有修改的對象恢復到原來的狀態,之後context.SaveChanges(); shoudl成功。

您可能也會覺得這有用http://dotnetadventurer.blogspot.com/2010/09/discarding-changes-to-objectcontext-in.html我還沒有試過他的代碼,我通常初始化我的上下文的方式不同,所以我不確定它是否可以與您的示例一起工作,但它非常簡單,所以如果是這樣,我會去。

+0

這就是我最終在我的案例中做的事情: –

相關問題