2009-10-08 59 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(); 
    } 

}