2013-03-07 96 views
1

我目前使用實體框架在asp.net中創建一個網站,我想知道什麼是實例化Entity Container的好方法?實體框架良好實踐

目前,我這樣做(其中MYDB是我的實體框架容器):

public partial class User : System.Web.UI.MasterPage 
{ 
    private myDb ctx; 
     protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) ctx = new myDb(); 
    } 
} 

而且我使用的許多功能的上下文。

但是,在很多網站上,我看到了這種方式來處理:

using (var ctx = new myDb()) 
{ 
} 

但如果使用第二個我已經把它在我的課的許多功能。然後重新實例化Entity Container

有什麼更好?你能否向我解釋爲什麼它更好,如果兩者都好,爲什麼在不同情況下我必須使用一個。

+2

就你而言,你可以調用'ctx。Dispose();'在'Page_Unload'事件中,並獲得與使用(var ctx = new myDb()){}'相同的效果。 – 2013-03-07 08:45:08

+0

感謝您的回答。什麼是使用方法的好例子? – 2013-03-07 08:46:58

+1

'using'在實現'IDisposable'的類上工作。當using塊完成時,調用'.Dispose()'方法。並且你釋放一個對象來釋放資源並釋放內存。對於示例中的數據庫對象,這也關閉了與數據庫的連接。 – 2013-03-07 08:50:05

回答

2

處置Entity Container的初步實踐來源於處置昂貴的資源,如SQL連接到數據庫就像

using (SqlConnection connection = new SqlConnection(connectionString)) 
{} 

不過的習慣中,該Entity Framework只有當查詢被執行,因此Entity Container有足夠的智能來打開連接不代表一個sql連接。所以從這個意義上講,沒有什麼真正的優勢,除了早一點收集垃圾。

此外,如果您正在處理上下文,則不能使用延遲加載。您應該使用與負載相關的數據Include。更多的信息在這裏Entity Framework - Load Reference Keys after disposing entity object context

總之,我看不出任何一個上下文每個請求方法的缺點。相比之下,沒有延遲加載對我來說是一個重要的缺點。

1

我想我會將我的意見添加爲答案。

在你的情況,你可以調用在Page_Unload事件ctx.Dispose();,並達到相同的效果

using (var ctx = new myDb()) 
{ 
} 

using作品上實施IDisposable類。當使用塊完成時,調用.Dispose()方法。並且你釋放一個對象來釋放資源並釋放內存。樣本中的數據庫對象從DbContext繼承並實現IDisposable,因此當調用Dispose()時,它也將關閉與數據庫的連接。

這當然會得到方便,如果你有很多請求。您不希望數千個打開的數據庫連接和大量內存佔用。

有一點需要注意的是,如果在Page_Unload之前拋出任何未處理的異常,那麼unload事件將不會被觸發,數據庫對象也不會被釋放。

那麼最好使用using,因爲它總是在對象上調用.Dispose()