将单例模式与实体框架上下文一起使用 - 底层提供程序在打开时失败

Det*_*ium 3 c# wcf design-patterns entity-framework

我正在尝试使用Entity Framework向我的DbContext添加单例模式.我总是使用单例模式,之前从未遇到过这个错误.我知道单身人士是最佳做法 (显然不是),但如果你们有时间有空,你能否解释为什么单身人士是最佳做法?

问题

除此之外,我收到此错误:

底层提供程序在打开时失败

我们来看看我的代码吧

DAO.cs

public class DAO
{
    private static HourRegistrationEntities hourRegInstance;

    public static HourRegistrationEntities HourRegInstance { get { return hourRegInstance = hourRegInstance ?? new HourRegistrationEntities(); } }
}
Run Code Online (Sandbox Code Playgroud)

Service.cs(示例方法)

/// <summary>
/// Return a list of all denied Hour Registration for the Login with the given stringId
/// </summary>
/// <param name="stringId"></param>
/// <returns>A list of HourRegistrationDTO</returns>
public List<HourRegistrationDTO> GetAllDeniedHoursForLogin(string stringId)
{
    var id = Int32.Parse(stringId);
    using (var db = DAO.HourRegInstance)
    {
        var dbHours = db.HourRegistration.Where(x => x.LoginProject.Login.ID == id && x.Denied == true).ToList();
        var returnList = new List<HourRegistrationDTO>();
        foreach (var item in dbHours)
        {
            returnList.Add(new HourRegistrationDTO()
            {
                Id = item.ID,
                Hours = item.Hours,
                Date = item.Date.ToShortDateString(),
                Comment = item.Comment,
                CommentDeny = item.CommentDeny,
                LoginProject = new LoginProjectDTO()
                {
                    Project = new ProjectDTO()
                    {
                        Title = item.LoginProject.Project.Title
                    }
                }
            });
        }
         return returnList;
    }            
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我总是使用单例模式,但以前从未遇到此错误.造成这种情况的原因是什么?为什么?

更新:

我基本上喜欢这样(下面的代码),因为这解决了问题.现在我对导致错误的原因更加好奇.

Service.cs

using (var db = new HourRegistrationEntities())
Run Code Online (Sandbox Code Playgroud)

Wik*_*hla 9

它不起作用的原因是你的using子句在首次使用后处理你的单例实例.在那之后,它变得无用,处置但仍然不为空.

事实上,你坚持你总是使用单身而且它总是有效并不是真的意味着什么.使用数据的上下文单身被认为是一个非常不好的习惯,导致许多问题,包括内存,并发性和交易问题.

我的猜测是,之前,你总是在单线程桌面应用程序的工作,在那里一个单身还是有风险的,但不会导致紧迫的问题.然而,在这里,在Web服务的并发世界中,它将无法工作.

在另一方面,每一个WCF调用创建一个新的实例是非常有效的,不同的情况下,不会干扰你正确处理它们使用后.

  • 我是计算科学助理教授,问候;) (3认同)