我目前正在使用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
。
什么更好?你能解释一下为什么它更好,如果两者都很好,为什么在不同的情况下我必须使用一个比另一个更多。
答案 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()
。