C# 实体框架出现异常:“基础提供程序在打开时失败。”

C# 实体框架出现异常:“基础提供程序在打开时失败。”,c#,.net,entity-framework,C#,.net,Entity Framework,我有个测试。发生的情况是,无论何时首先执行test1,test2都会失败,并显示以下消息: System.Data.EntityException:System.Data.EntityException: 基础提供程序在打开时失败。无法打开数据库 登录请求的数据库实体。登录失败 无论何时首先执行test2,test1都会失败,并显示相同的消息 在过去的三天里我一直在做这个 [TestClass] class MyTestClass { DBEntities db; [Tes

我有个测试。发生的情况是,无论何时首先执行test1,test2都会失败,并显示以下消息:

System.Data.EntityException:System.Data.EntityException: 基础提供程序在打开时失败。无法打开数据库 登录请求的数据库实体。登录失败

无论何时首先执行test2,test1都会失败,并显示相同的消息

在过去的三天里我一直在做这个

[TestClass]
class MyTestClass 
{

    DBEntities db;

    [TestInitialize]
    public void Initializer()
    {
       db = new DBEntities(); 
    }

    [TestMethod]
    public void test1()
    {
       db.Books.Add(new Book{ ...});
       db.SaveChanges();

    }

    [TestMethod]
    public void test2()
    {
       db.Books.Add(new Book{ ...});
       db.SaveChanges();
    }


    [TestCleanup]
    public void Clean()
    {
       db.Dispose(); 
    }

}
以下是DBEntities类的摘录:

public class DBEntities : DbContext
{
    public DbSet<Books> TheBooks{get;set;}
    ...
}
运行探查器后,我注意到以下消息:

用户登录失败。原因:无法打开显式指定的数据库


在大量lockAcquired和LockRelease语句之后。

信息的重要部分是:

用户“domain1\user1”登录失败


如果数据库拒绝您传递的登录信息,则EF无法工作

问题可能是连接池?即使释放了EF对象,SQL提供程序是否会尝试保留测试之间的连接?在这种情况下,同一用户对同一数据库的多个连接是否会出现问题

尝试在清理中显式关闭连接:

db.Database.Connection.Close();

有时,您可以在运行框中键入iisreset,它将解决您描述的问题,特别是如果一切正常,突然停止工作。由于系统内存不足,可能会发生此错误。至少就我而言


>运行>>iisreset>

如果您正在运行IIS,请检查连接到web应用程序的IIS池的标识

仅粘贴异常消息不会帮助社区帮助您。你的连接字符串是什么?数据库db1是否已打开?您使用的是什么版本的SQL?在其他人打开数据库db1之前,您需要做一些工作,但是第一个测试无法打开数据库db1,第二个测试和第三个测试无法打开数据库db1。我只看到两个测试,所以哪个测试通过?哪个先运行,哪个就通过。这是非常奇怪的行为;请使用探查器查看数据库中发生的情况,如dupe中所述。另外,请不要再问同样的问题。实际上,它接受来自第一个测试的登录信息,无论哪个先运行,都是通过的。尽管其他人都使用相同的登录信息,但他们拒绝了。我知道第一个测试有效,第二个测试无效,但消息是明确的。数据库服务器拒绝登录。因此,您断言他们使用相同的登录信息是不正确的。第二次测试发生了一些变化。我正在配置文件中使用内置的Windows身份验证。我没有指定任何密码。所以,我不明白为什么会失败。或者SQL Server Express不允许从同一个客户端进行多个连接?嗨,贾斯汀,我想你有什么发现。因为我已经观看了探查器,从同一个用户那里获取并释放了很多锁,然后突然出现错误:用户登录失败。原因:无法打开显式指定的数据库。“TestInitialize”和“TestCleanup”将在每次测试之前/之后运行,因此您将向db提供程序抛出大量流量以创建/打开/关闭连接。特别是在这里展示的简单测试中,您可能设置了竞争条件并发问题,您的测试代码领先于提供程序。您是否可以在ClassInitialize方法中创建一次db对象,而不是每次测试?@Justin,我现在正在尝试,并会让你在一段时间内知道我的直觉,也就是说,不确定,是的,测试请求连接的速度比提供商能够处理的要快。这不一定会带来更多的流量,但如果测试代码简单,它将快速执行;管理数据库连接最终将在代码外部调用,可能是非托管的&可能要慢得多。当您运行一个测试时,请关闭连接,然后立即运行另一个测试,第一个连接可能仍处于打开状态,而您正在为同一用户请求下一个连接到同一个db文件->冲突。感谢内存不足提示-我修复了数据库并发现了内存泄漏。