2016-01-24 29 views
2

我實現了一個基本的控制器實例化每個請求一個新DbContext如果使用每個請求一個的DbContext實例,我應該處理的每個請求的情況下,以及:

public class BaseController: Controller 
{ 
    protected HawkHeadDbContext Db { get; set; } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     Db = new HawkHeadDbContext(); 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     Db.SaveChanges(); 
     Db.Dispose(); 
    } 
} 

我只是有點擔心,調用可能會成爲CPU密集型,也許我應該在Dispose方法BaseController中處理上下文。我懷疑控制器是爲每個請求實例化的,但不知道是否在每個請求後調用Dispose,或者在常規的「DisposeAllControllers」類型操作中調用。

+0

「當使用Web應用程序,使用**每個請求的上下文實例。* *「https://msdn.microsoft.com/en-us/data/jj729737.aspx – magicandre1981

+0

@ magicandre1981我爲每個請求使用一個實例。你在'OnActionExecuting'中怎麼做'Db = new HawkHeadDbContext();'?我不是在問這個問題,而是關於什麼時候處理上下文,因爲這樣做可能會延長請求的時間。我可能不會在'OnActionExecuted'中進行處理,但是隨後會有越來越多的未處理但未使用的上下文,我可能會以其他一些批處理方式處理這些上下文。 – ProfK

回答

4

上下文設計爲短時間使用壽命。通常你看到它在

using(var ctx = new DbContext()) 
{ 
    ... 
} 

這意味着ctx.Dispose剛剛在使用結束後被調用。

更多詳細信息here,請參見「生命週期」部分。因此,對於你的代碼,如果你沒有使用依賴注入(在這種情況下,你將根據請求配置dbcontext),那麼你在執行操作之後做得很好。

唯一擔心的會是什麼,如果你叫孩子的行爲。在這種情況下,你可能最終爲每個請求一個以上的DbContext

+0

所以,也許我應該檢查它是否是一個孩子的行爲,並跳過創建一個新的上下文。我不知道默認情況下是否可以檢查,但我可以用一個屬性標記子動作,如果尚未建立'ChildActionOnly'屬性。我只會稍後使用DI,然後我會讓它處理處理。 – ProfK

相關問題