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

3
在生产环境中,我开始在整个应用程序中遇到以下错误:
The underlying provider failed on Open

据我所知,当我在本地测试应用程序时,似乎没有遇到此错误(无论我做什么都无法复现)。我正在使用 Azure SQL 服务器,以下是我的连接字符串:
<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=myserver.windows.net,1433;Database=mydb;User ID=username;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

以下是我遇到错误的其中一种方法:

public IEnumerable<Country> GetCountries()
{
        List<Country> countries;
        using (var databaseContext = new Database())
        {
            countries = databaseContext.Countries.OrderBy(c => c.Name).ToList();
        }

        return countries;
}

我想强调的是错误不是一直发生,它似乎是随机发生的。这个问题是今天开始出现的,我没有改变这段代码、连接字符串或数据库设置,但是(!)我已经将一些方法从同步改为异步 - 我不知道这是否与这个特定的问题有关。
另外,据我所知,这只发生在ASP.net Web API项目中,而不是ASP:net MVC项目中(它们共享相同的服务层并从服务调用相同的方法)。
最后,这里是整个堆栈跟踪的Pastebin链接(我不会在此粘贴它,因为它太大):link

它是随机的还是总是与异步函数(如GetUsaStates())相关联的?如果是这样,我希望新线程无法访问在启动线程上创建的EF上下文。 - Neil Thompson
3个回答

3
请查看此帖子:错误信息“打开底层提供程序失败”
以下是应该解决您问题的摘录:

将我的代码更改为以下内容即可修复:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

那么每次我初始化 DB Context 都必须添加这段代码吗? - hyperN
还有一件事,为什么这突然发生了?就像我说的,我没有改过代码。 - hyperN

0
在您的DbContext构造函数中添加连接字符串,例如:`。
public YourDbContext()
          :base(name="YourDbContext")
{
this.Database.Connection.ConnectionString = "Data Source=****;Initial Catalog=****;User ID=****;Password=****";
}

0

我在 Azure 进行测试时遇到了相同的错误。在我的情况下,我忘记在应用程序 web.config 中更新密码。更新后,它对我来说可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接