C# 使用静态方法的静态类是否可以防止实体框架打开太多连接

C# 使用静态方法的静态类是否可以防止实体框架打开太多连接,c#,asp.net,linq,entity-framework,static-methods,C#,Asp.net,Linq,Entity Framework,Static Methods,我开始了一个新项目,其中使用了带有EF4.1的MVC3。服务层作为WCF托管,然后它有一个实体框架项目。建立的服务层使用带有静态方法的静态类与实体框架对话 现在我罚款静态不是一个“好主意”是更难的单元测试和不允许多态性等。。。我的团队领导说“静态的原因是它不会打开一堆到实体框架的连接”,这在我看来是不正确的 下面是一个示例类,它使用Linq从EF获取数据 using System; using System.Collections.Generic; using System.Linq; usin

我开始了一个新项目,其中使用了带有EF4.1的MVC3。服务层作为WCF托管,然后它有一个实体框架项目。建立的服务层使用带有静态方法的静态类与实体框架对话

现在我罚款静态不是一个“好主意”是更难的单元测试和不允许多态性等。。。我的团队领导说“静态的原因是它不会打开一堆到实体框架的连接”,这在我看来是不正确的

下面是一个示例类,它使用Linq从EF获取数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using PM.DAL;
using PM.DomainModel;
using PM.DomainModel.Staffing;
using PM.Service.DataMapper;
using PM.DomainModel.Enums;

namespace PM.Service
{
public static class Staffing
{

    public static List<HabMatrixSchedule> GetDefaultHabMatrixSchedule()
    {
        var query = new List<HabMatrixSchedule>();
        using (var ctx = new DDDPROGRAM_MONITORING_DBEntities())
        {
                query = (from ad in ctx.lkptblDEFAULT_RESOURCE_ALLOCATION_DETAIL
                         join hl in ctx.lkptblHOUR_LOOKUP on ad.HOUR_LOOKUP_ID
                         equals hl.HOUR_LOOKUP_ID
                         select new HabMatrixSchedule()
                         {
                             DEFAULT_RESOURCE_ALLOCATION_DETAIL_ID = ad.DEFAULT_RESOURCE_ALLOCATION_DETAIL_ID,
                             HOUR_LOOKUP_ID = hl.HOUR_LOOKUP_ID,
                             WEEKDAY_CATEGORY_VALUE_ID = ad.WEEKDAY_CATEGORY_VALUE_ID,
                             HOUR_START = hl.HOUR_START,
                             HOUR_END = hl.HOUR_END,
                             Resource_Count = ad.RESOURCE_COUNT,
                             CurrentWeekDayTime = new WeekDayTime(ad.WEEKDAY_CATEGORY_VALUE_ID, hl.HOUR_LOOKUP_ID)                                 
                         }).ToList();

            return query;
        }


    }


}

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用PM.DAL;
使用PM.domain模型;
使用PM.DomainModel.Staffing;
使用PM.Service.DataMapper;
使用PM.DomainModel.Enums;
名称空间PM.Service
{
公共静态类人员配置
{
公共静态列表GetDefaultHabMatrixSchedule()
{
var query=新列表();
使用(var ctx=new DDDPROGRAM\u MONITORING\u DBEntities())
{
查询=(来自ctx.lkptblDEFAULT\u资源\u分配\u详细信息中的ad)
在ad.HOUR\u LOOKUP\u ID上的ctx.lkptblHOUR\u查找中加入hl
等于hl.HOUR\u查找\u ID
选择新的HabMatrixSchedule()
{
默认资源分配详细信息ID=ad.DEFAULT资源分配详细信息ID,
HOUR\u LOOKUP\u ID=hl.HOUR\u LOOKUP\u ID,
工作日\类别\值\ ID=ad.WEEKDAY\类别\值\ ID,
小时开始=小时开始,
小时结束=小时结束,
资源计数=广告资源计数,
CurrentWeekDayTime=新的工作日时间(ad.WEEKDAY\类别\值\ ID,hl.HOUR\查找\ ID)
}).ToList();
返回查询;
}
}
}
}

代码当然可以并行调用,除此之外,我认为没有理由限制负载(以非静态函数无法实现的方式)。(它是否能无错误地并行执行取决于共享数据。可能甚至有一个互斥对象,但我仍然看不出静态ness在多大程度上改变了这种情况。)

这是一篇关于工作单元模式的好文章。这是我在并行执行代码时构建应用程序的方式

您展示的这个静态方法每次调用时都会创建新的上下文。所以,如果从方法定义中移除静态,它不会改变任何东西


除非创建一个用户桌面应用程序,否则不应创建静态上下文。对于web应用程序,您应该为每个web请求创建一个上下文。

仅供参考,EF不是线程安全的。我相信它确实打开了多个连接,或者更确切地说,它试图打开多个连接。在使用多线程和EF之前,我遇到过一些问题。尝试使用UnitOfWork方法。那么上面的代码看起来不应该使用静态方法吗?明智的说法是:“连接池”。好的,这是两个词。@JohnSaunders请解释连接池与静态方法的关系。不管是静态连接还是实例连接,不管你认为自己打开了多少个“连接”,连接池意味着你打开的数量要少得多——也许只有一个。好吧,出于真诚的好奇,去问问吧。我不知道是否有您的示例没有反映的情况,但如果没有,我很有信心声称
static
关键字没有达到预期效果。我熟悉UOW,但该模式只是一种通常与存储库模式一起使用的模式,解释模式如何防止打开连接的问题?EF 4.1我要说的是,您的EDMX设计器文件有一个部分文件,其中实现了ObjectContext。所以,关于ObjectContext,我们知道它在内部实现了几个模式,包括身份映射和工作单元。