2013-03-07 93 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()