我现在正在学习EF,有一个关于ObjectContext的问题:
当我访问数据库时,是否应该为每个查询(函数)创建ObjectContext实例?
或者创建一次(单例)并重用它会更好?
在EF之前,我使用了企业库数据访问块,并为DataAccess函数创建了数据访问实例...
发布于 2010-04-28 03:08:22
对于每个查询都是绝对有效的。它是一个轻量级的对象,所以每次你需要它的时候创建一个都不会产生太多的成本。
此外,您让ObjectContext存活的时间越长,当您对它运行查询时,它包含的缓存对象就越多。这可能会导致内存问题。因此,将ObjectContext作为单例是一个特别糟糕的主意。随着应用程序的使用,您会在单例ObjectContext中加载越来越多的实体,直到最终将整个数据库放入内存中(除非您在不再需要实体时将其分离)。
还有一个可维护性的问题。有一天,你试图追踪一个bug,但找不到导致它的数据加载在哪里。
发布于 2010-04-28 03:41:06
我认为最常见的方式是按请求使用它。在开始时创建它,做你需要的(大多数时候这些都是需要公共ObjectContext的操作),在结束时处理。大多数依赖注入框架都支持这种场景,但您也可以使用HttpModule创建上下文并将其放在HttpContext.Current.Items中。这是一个简单的例子:
public class MyEntitiesHttpModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += ApplicationBeginRequest;
application.EndRequest += ApplicationEndRequest;
}
private void ApplicationEndRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Items[@"MyEntities"] != null)
((MyEntities)HttpContext.Current.Items[@"MyEntities"]).Dispose();
}
private static void ApplicationBeginRequest(Object source, EventArgs e)
{
var context = new MyEntities();
HttpContext.Current.Items[@"MyEntities"] = context;
}
}发布于 2010-04-28 03:11:02
不要使用单例..每个使用你的应用程序的人都会分享,当对象上下文跟踪实体时,各种疯狂的事情都会发生。
我会将其添加为私有成员
https://stackoverflow.com/questions/2724176
复制相似问题