首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架ObjectContext重用

实体框架ObjectContext重用
EN

Stack Overflow用户
提问于 2010-04-28 03:04:19
回答 6查看 4.7K关注 0票数 13

我现在正在学习EF,有一个关于ObjectContext的问题:

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-28 03:08:22

对于每个查询都是绝对有效的。它是一个轻量级的对象,所以每次你需要它的时候创建一个都不会产生太多的成本。

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

还有一个可维护性的问题。有一天,你试图追踪一个bug,但找不到导致它的数据加载在哪里。

票数 14
EN

Stack Overflow用户

发布于 2010-04-28 03:41:06

我认为最常见的方式是按请求使用它。在开始时创建它,做你需要的(大多数时候这些都是需要公共ObjectContext的操作),在结束时处理。大多数依赖注入框架都支持这种场景,但您也可以使用HttpModule创建上下文并将其放在HttpContext.Current.Items中。这是一个简单的例子:

代码语言:javascript
复制
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;
    }
}
票数 15
EN

Stack Overflow用户

发布于 2010-04-28 03:11:02

不要使用单例..每个使用你的应用程序的人都会分享,当对象上下文跟踪实体时,各种疯狂的事情都会发生。

我会将其添加为私有成员

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2724176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档