实体框架的良好实践

时间:2013-03-07 08:40:46

标签: c# asp.net entity-framework

我目前正在使用Entity Framework在asp.net中创建一个WebSite,我想知道实例化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 个答案:

答案 0 :(得分: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 :(得分:1)

我以为我会将我的评论添加为答案。

在您的情况下,您可以在ctx.Dispose();事件中致电Page_Unload并获得与

相同的效果
using (var ctx = new myDb()) 
{ 
}

using适用于实现IDisposable的类。当使用块完成时,将调用.Dispose()方法。并且您释放一个对象以释放资源并释放内存。样本中的数据库对象继承自DbContext并实现IDisposable,因此当调用Dispose()时,它也将关闭与数据库的连接。

如果您有很多请求,这当然会派上用场。您不希望数以千计的数据库打开连接并占用大量内存。

要注意的一件事是,如果在Page_Unload之前抛出任何未处理的异常,则不会触发unload事件并且不会处理数据库对象。

然后最好使用using,因为它总是在对象上调用.Dispose()