2010-02-12 26 views
0

我有一個基於Shoulders of Giants | A RESTful Wizard Using ASP.Net MVC… Perhaps?編輯的RESTful嚮導。這個嚮導有一個CANCEL按鈕,當按下它時,會觸發下面的代碼。強制刪除頁面上的ObjectStateManager條目

// If the user cancels, drop out altogether 
if (!string.IsNullOrEmpty(CANCEL_BUTTON)) { 
    Session.Remove(VACANCYWIZARD_SESSION_KEY); 
    repository._entities.ObjectStateManager.GetObjectStateEntry(inProgressVacancyWizard.Vacancy).Delete(); 
    return this.RedirectToAction("Index", "Home"); 
} 

現在,爲了能夠調用的SaveChanges ()取消按鈕後,我必須手動刪除從我ObjectStateManager嚮導中的條目。但是,當您通過手動返回到主頁取消嚮導時,它將保留並且_entities.SaveChanges()的下一次調用將拋出一個異常,它無法將對象從嚮導進度保存到數據庫,因爲它仍處於對象狀態。

請注意,在嚮導的步驟之間我做而不是保存任何內容到數據庫。我把它在會話狀態檢索它的每一步:

NewVacancy inProgressVacancyWizard = Session[VACANCYWIZARD_SESSION_KEY] as NewVacancy; 

不知何故,但是,inProgressVacancyWizard.Vacancy會出現在ObjectStateManager所以我只好去其他地方刪除它,我會得到錯誤,不完整空缺車型,而_entities.SaveChanges()被另一個對象調用。

有沒有辦法來解決這個問題?

//編輯 經過一番閱讀後,我發現我的知識庫的基礎不好。如發現 here。目前我懷疑在同一篇文章中實現「每個業務事務的一個ObjectContext實例」中提到的選項。這會是一個明智的事情嗎?我想更多地瞭解它,因爲它將是一個重要的重構。

public static Repository Instance 
    { 
     get 
     { 
      if (instance == null) { 
       instance = new Repository(); 
      } 
      return instance; 
     } 
    } 

#region Constructor: Repository() 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    private Repository() 
    { 
     _entities = new DBModelEntitiesNew2(); 

    } 

回答

1

看起來好像您在多個請求中使用單個ObjectContext實例。不要這樣做。它只會導致你的痛苦。它使您的Web服務器成爲有狀態的。在呈現響應之後(我們從Controller.Dispose間接執行)處理ObjectContext,併爲下一個請求新建一個新對象。

+0

謝謝你的迴應,這確實是問題所在。儘管讓我的嚮導頁面切換並不那麼容易。這將是最終的答案,因爲它是正確的。雖然我很想聽聽關於編輯信息的一些意見。 – bastijn 2010-02-22 22:08:06

+0

爲什麼要使存儲庫成爲單身人士?這對我來說沒有意義。你希望你的網絡應用程序是無狀態的。 – 2010-02-22 22:42:02