gpt4 book ai didi

c# - 将单例模式与 Entity Framework 上下文一起使用 - 底层提供者在打开时失败

转载 作者:行者123 更新时间:2023-11-30 13:16:36 25 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 向我的 DbContext 添加单例模式。我一直为此使用单例模式,之前从未遇到过此错误。 我知道单例是最佳实践 (显然不是)但如果你们有空,能否请您解释一下为什么单例是最佳实践?

问题

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

The underlying provider failed on open

让我们看看我的代码

DAO.cs

public class DAO
{
private static HourRegistrationEntities hourRegInstance;

public static HourRegistrationEntities HourRegInstance { get { return hourRegInstance = hourRegInstance ?? new HourRegistrationEntities(); } }
}

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;
}
}

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

更新:

我基本上是这样做的(下面的代码),因为这样可以解决问题。现在我更好奇是什么导致了错误。

Service.cs

using (var db = new HourRegistrationEntities())

最佳答案

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

你坚持说你总是使用单例并且它总是有效的事实并没有任何意义。将单例用于数据上下文被认为是一个非常糟糕的习惯,会导致许多问题,包括内存、并发和事务问题。

我的猜测是,之前您总是在单线程桌面应用程序上工作,其中单例仍然存在风险但不会立即导致问题。然而,在 Web 服务的并发世界中,它根本行不通。

另一方面,每次 wcf 调用创建一个新实例是完全有效的,不同的实例不会干扰,您可以在使用后正确处理它们。

关于c# - 将单例模式与 Entity Framework 上下文一起使用 - 底层提供者在打开时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32268335/

25 4 0
文章推荐: c# - 带有 Visual Studio 2013 的 Crystal 报表 aspnet_client/system_web/4_6_81
文章推荐: C# 创建具有动态属性的对象 : LINQ select List values by property names array