【问题标题】:EntityException: The underlying provider failed on OpenEntityException:基础提供程序在打开时失败
【发布时间】:2012-11-14 11:34:08
【问题描述】:

我在使用 Entity Framework 连接到我的数据库时遇到问题。尝试连接数据库时随机出现以下错误...

EntityException: The underlying provider failed on Open.
The connection was not closed. The connection's current state is connecting.

为了向您介绍我的设置背景,我使用的是 MVC 4 和 Ninject。我还在使用this article 中描述的存储库和工作单元模式。我在 MVC 4 中使用默认的 NinjectWebCommon 文件,我的 RegisterServices 方法如下...

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMyEntities>().To<MyEntities>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
    // UnitOfWork has a dependency on MyEntities

    kernel.Bind<IAccountManager>().To<AccountManager>(); 
    kernel.Bind<ITransactionManager>().To<TransactionManager>(); 
    // AccountManager and TransactionManager has a dependency on UnitOfWork
}

我的页面加载正常,但页面上有 2 个导致错误的 ajax 调用。删除 ajax 调用后,永远不会发生错误。当只有 1 个 ajax 调用时,永远不会发生错误。只有当两个调用同时进行时才会发生错误。

这里有 2 个不同的 web api 控制器...

public class AccountController : ApiController
{
    private readonly IAccountManager _AccountManager;

    public AccountController(IAccountManager accountManager)
    {
        _AccountManager = accountManager;
    }

    public HttpResponseMessage Get()
    {
        IEnumerable<Account> accounts = _AccountManager.Get();
        return Request.CreateResponse(HttpStatusCode.OK, accounts);
    }
}

public class TransactionController : ApiController
{
    private readonly ITransactionManager _TransactionManager;

    public TransactionController(ITransactionManager transactionManager)
    {
        _TransactionManager = transactionManager;
    }

    public HttpResponseMessage Get()
    {
        IEnumerable<Transaction> transactions = _TransactionManager.Get();
        return Request.CreateResponse(HttpStatusCode.OK, transactions);
    }
}

我真的不知道在这里做什么。我已经阅读了 StackOverflow 和 Google 上与此相关的所有文章,但我找不到答案。有谁知道我可以做些什么来阻止这个问题的发生?

【问题讨论】:

  • 底层上​​下文的位置以及生命周期是什么并不完全清楚,但您必须确保两个控制器都有自己的上下文。现在看来,一个控制器处理上下文,而另一个控制器在第一个控制器仍然忙碌时执行相同操作。
  • 我有完全相同的问题,不使用事务(TransactionScope 类)似乎暂时解决了我的问题。我还没有弄清楚 TransactionScope 究竟做了什么来破坏连接。

标签: entity-framework ninject


【解决方案1】:

我遇到了同样的问题,最终我发现同一个 UnitOfWork 实例正在从不同的线程访问。我对 Ninject 不是很熟悉,但我建议检查您的 Account 和 TransactionManager 以确保它们正在访问不同的 UnitOfWork 实例。

【讨论】:

  • 这听起来像是发生在我身上的事情。当您发现同一个 UnitOfWork 正在从不同的线程访问时,您是如何解决的?
  • 我将 Unity Container 用于 DI 目的,并且错误地为 Repositories 的解析器提供了一个 set 实例。因此,我每次解析一个存储库时,它都有相同的常量 UnitOfWork,在我的情况下也有相同的 ObjectContext。最后,我只是将 UnitOfWork 实例的创建移到了我的 Repository 类中,此后我没有遇到任何问题。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多