实体框架给出异常:"底层提供程序在Open上失败."

Att*_*lah 10 .net c# entity-framework

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

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

并且每当首先执行test2时,test1将失败并显示相同的消息.

过去3天我一直在这里.

[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(); 
    }

}
Run Code Online (Sandbox Code Playgroud)

这是DBEntities类的摘录:

public class DBEntities : DbContext
{
    public DbSet<Books> TheBooks{get;set;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

运行探查器后,我注意到这条消息:

"用户登录失败.原因:未能打开明确指定的数据库."

经过大量的lockAcquiredlockReleased陈述.

Jus*_*ton 11

问题可能是连接池?即使EF对象被处置,SQL提供程序是否会尝试保留测试之间的连接?在这种情况下,同一个用户是否存在与同一个DB的多个连接的问题?

尝试在清理中明确关闭连接:

db.Database.Connection.Close();
Run Code Online (Sandbox Code Playgroud)

  • 'TestInitialize'和'TestCleanup'将在每次测试之前/之后运行,因此您在数据库提供程序中投入大量流量来创建/打开/关闭连接.特别是通过这里展示的简单测试,您可能会为竞争条件做好准备(测试代码的并发性问题超越提供商). (2认同)
  • 您是否可以在ClassInitialize方法中创建db对象,而不是每次测试? (2认同)
  • 我的*gut*感觉(即,不确定),是的,测试是请求连接_faster_而不是提供者可以处理.它不一定是更多流量,但如果您的测试代码很简单,它将快速执行; 管理数据库连接将在您的代码之外调用(最终,可能是非托管的)并且可能要慢得多.当您运行一个测试,关闭连接,然后立即运行另一个测试时,第一个连接可能仍在打开,而您请求下一个(对于相同的用户到同一个db文件) - >冲突. (2认同)

Cra*_*ntz 4

该消息的重要部分是:

用户“domain1\user1”登录失败。

如果DB拒绝你传递的登录信息,那么EF就无法工作。