2013-04-16 15 views
0

關於工作單元模式有很多可用的信息,但其中大多數不同。EntityFramework:通過工作單元模式請求每個請求的實體上下文

我知道我應該爲每個請求提供自己的實體上下文。而且,我應該使用單位的工作模式,以實現這一目標

所以,我已經實現了它正是這樣(從這裏Entity Framework and Connection Pooling):http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

,但只有該實現,我沒有一個每個請求的上下文,所有請求都共享相同的上下文,對吧?

然後我發現這個鏈接:http://www.mindscapehq.com/blog/index.php/2008/05/12/using-the-unit-of-work-per-request-pattern-in-aspnet-mvc/

但現在我還記得,我應該持有會話的上下文/ HttpContext.Items變量。是對的嗎?

我在哪裏可以找到最佳實施教程?

回答

2

我遵循second link中給出的模式。您沒有使用該模式在所有請求中共享上下文。看一看示例代碼:

public class StudentController : Controller 
{ 
    private IStudentRepository studentRepository; 

    public StudentController() 
    { 
     this.studentRepository = new StudentRepository(new SchoolContext()); 
    } 
} 

對於每個請求到Student控制器,這個類的一個新的實例將被創建。在該類的構造函數中,它使用新的上下文創建新的存儲庫實例。這意味着上下文將只在該請求的整個生命週期內存在。

編輯:這裏有一個小更多的澄清:

也許在這個過程中倒着走,將有助於澄清。從訪問者在控制器中發起一些動作開始。 ASP.NET將創建一個控制器類的實例。創建該實例時,您將在內存中創建一個上下文環境,使在該請求的持續時間內保持活動狀態,而不再是

這可以很好地工作,因爲您正在控制器內執行工作。假設用戶要求更新其個人資料的示例。你如何用Entity Framework(EF)處理?首先,您將使用您的存儲庫並獲取其用戶記錄。您的上下文現在知道該對象。然後,您將訪問者提供的數據(假設他們想要更改他們的電話號碼)並使用新值更新您的EF對象。上下文跟蹤這些更改,因此在您的操作結束時,您可以撥打.Save(),並將正確更新到您的數據庫。

+0

好吧,所以我理解「每個請求」的方式是錯誤的。我認爲「每次請求」意味着我的網頁的所有訪問由唯一訪問者標識。但是,然後Unit Of Work與把全局使用的靜態變量放在上下文中幾乎是一樣的呢? –

+0

還是將它與控制器中的私有變量保持上下文幾乎相同?我現在很困惑。 –

+0

@FelixC - 我更新了我的答案以提供一些附加信息。 –