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.

什么是更好的?你能解释一下为什么它更好吗?如果两者都很好,为什么在不同的情况下我必须多使用一个。

4

2 回答 2

2

处置Entity Container的习惯来自于处置昂贵的资源如sql连接到数据库的习惯,如

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

但是,Entity Framework它足够智能,仅在执行查询时才打开连接,因此Entity Container不代表 sql 连接。所以在这个意义上没有真正的优势,除了早一点收集垃圾。

此外,如果您要处理上下文,则不能使用延迟加载。您应该使用与负载相关的数据Include。更多信息在这里Entity Framework - 在处理实体对象上下文后加载引用键

总之,我看不出每个请求方法一个上下文的任何缺点。相比之下,没有延迟加载对我来说是一个重要的缺点。

于 2013-03-07T09:10:09.160 回答
1

我想我会添加我的评论作为答案。

在您的情况下,您可以调用ctx.Dispose();事件Page_Unload并达到与

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

using适用于实现IDisposable的类。当 using 块完成时,将.Dispose()调用该方法。然后你处理一个对象来释放资源并释放内存。示例中的数据库对象继承自DbContext并实现 IDisposable,因此当调用Dispose()时,它也会关闭与数据库的连接。

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

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

那么最好使用using,因为它总是调用.Dispose()对象。

于 2013-03-07T09:07:52.063 回答