实体框架ObjectContext重用

ver*_*ror 13 asp.net entity-framework

我现在正在学习EF并且对ObjectContext有疑问:

我访问数据库时是否应该为每个查询(函数)创建ObjectContext实例?

或者最好创建一次(单例)并重用它?

在EF之前我使用企业库数据访问块并为DataAccess函数创建了dataacess实例...

Luk*_*Led 15

我认为最常见的方法是根据请求使用它.在开头创建它,做你需要的(大多数时候这些是需要常见ObjectContext的操作),最后处理.大多数DI框架都支持这种情况,但您也可以使用它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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Ron*_*erg 14

绝对适合每一个查询.它是一个轻量级的对象,因此每次需要时都不会产生太多的成本.

此外,保持ObjectContext活动的时间越长,对它运行查询时它将包含的缓存对象就越多.这可能会导致内存问题.因此,将ObjectContext作为单例是一个特别糟糕的主意.在使用您的应用程序时,您在单例ObjectContext中加载越来越多的实体,直到最终您将整个数据库放在内存中(除非您在不再需要实体时分离实体).

然后是可维护性问题.有一天,你试图追踪一个错误,但无法弄清楚导致它的数据加载位置.

  • 如果唯一的选择是单身和访问,我同意这个答案.但是有一整套生命周期,其中一些可能会根据应用程序提供更好的性能.上下文缓存有一个原因:)每个请求是on-access旁边的"最安全". (3认同)