2012-07-18 83 views
1

我正在使用EF 4.2並且遇到了一個非常隨機且沒有警告的問題。我有一個更新數據庫的Windows服務。在服務中我有一個計時器。當定時器的時間過去時,一個方法被調用。這是該方法實體框架SaveChanges並不總是工作

IEnumerable<Foo> foos = GetFoosFromDB(); 
foreach (Foo foo in foos) 
{ 
    if (some condition) 
    { 
     foo.Bar = 1; 
    } 
    if (some other condition) 
    { 
     foo.Bar = 2; 
    } 

    if (yet some other condition) 
    { 
     foo.Bar = 3; 
    } 
    else 
    { 
     int val = GetSomeValueFromDB(); 

     if (val == something) 
     { 
      if(GetSomeOtherValueFromDB()) 
      { 
       foo.Bar = 4; 
      } 
      else 
      { 
       CallSomeMethodThatAlsoCallsSaveChanges(); 
       foo.Bat = SomeCalculatedValue(); 
      } 
     } 
    } 
} 
SaveChanges(); 

現在的基本結構,但問題是,一旦我們開始與數據庫了一天的工作,並有該數據庫的表中的幾行(我們正在談論100或200行),然後即使調用此方法,SaveChanges似乎也沒有做它應該做的事情。我究竟做錯了什麼?

感謝,

薩欽

+0

你有什麼對日誌文件? – Turbot 2012-07-18 17:16:39

+0

做'CallSomeMethodThatAlsoCallsSaveChanges'和'SaveChanges()'使用不同的上下文實例嗎? – 2012-07-18 17:56:49

+0

沒有日誌,我很害怕。不,他們使用相同的上下文。 – 2012-07-19 09:28:49

回答

1

忽略代碼的其他方面,此行停留了作爲一個可能的問題:

else 
{ 
     CallSomeMethodThatAlsoCallsSaveChanges(); 
     foo.Bat = SomeCalculatedValue(); 
} 
// a few }} later... 
SaveChanges(); 

當執行這個邏輯分支,您的上下文的掛起更改致力於數據庫(根據您提供的內容)。根據您創建和管理數據庫上下文對象的方式,您已清除修改後的列表,或者引入了潛在的更改衝突。在循環之後調用SaveChanges()時,它可能會或可能不會有待提交的更改(取決於條件邏輯是否調用了其他方法)。

考慮使用該邏輯正在執行哪些邏輯單元工作並使這些UoW以原子方式分離。考慮如何創建,管理和傳遞數據庫上下文,因爲這些維護對象的本地狀態。

如果您仍然有問題,你可以發佈更多的代碼,並且我們可以嘗試解決futher