2012-11-05 31 views
3

我正在寫一個非常簡單的ASP.net項目。它使用Linq2Sql DataContext訪問存儲過程。有一個IDisposable類在它的構造函數中創建一個新的DataContext,並將其置於它的dispose中。將我的DataContext存儲在會話內存中是一個好主意嗎?

只要有可能我組裏的共同要求:

using(var dc = new MyDataAccessClass()) 
    { 
     //All the data requests in here 
    } 

    // Do stuff with the data here 

因此,有遍佈大多在用戶控件的代碼相當多的這些,我只是在想,如果它將使意義,創建單DataAccess類在起始頁(或母版頁)的PageLoad中,將其存儲在會話內存中,並引用所有UserControls中的內容,然後將其丟棄到PreRender階段。

所以這是我的問題,這是一個壞主意嗎?我想這會涉及到數據庫的一些懸掛連接,因爲異常或調試會阻止PreRender的運行。 也許檢查MasterPage的Load以查看該會話變量中是否有任何內容,如果是,則對其進行分類。

還是有更聰明的方式來分享整個頁面生命週期的DataContext沒有你的DBA想打你的鍵盤?

+1

看看這個awser:http://stackoverflow.com/questions/226127/multiple-single-instance-of-linq-to-sql-datacontext –

+0

@FelipeOriani蕩,我保證我花了好60秒尋找重複。對不起這個。 –

+0

我認爲在會話中存儲上下文是一個壞主意。我不知道這是否是最佳做法,但可以將其存儲在System.Web.HttpContext.Current.Items中。至少它只要求範圍。 – maralfol

回答

4

會話很可能不是一個好主意 - 您必須擔心併發性,恢復斷開的連接等。另外,在PreRender中部署上下文的方法並不是最好的,因爲如果出現異常,PreRender處理程序永遠不會執行。

System.Web.HttpContext.Current.Items是ASP.NET中僅存在於單個請求期間的唯一存儲空間,當處理執行過程中在不同線程之間傳輸ASP.NET請求時,這種情況也很少發生。

您可以在global.asax中使用Application_EndRequest事件來始終正確處理您的連接(在發生錯誤後也會調用EndRequest)。

相關問題