如何检查LocalDB中的数据库创建是否完成

问题描述 投票:0回答:1

我正在使用SQL Server和Entity Framework Core 3.1一起作为数据库的项目。对于单元测试/集成测试,我们使用LocalDB。

为了确保LocalDB数据库处于正确的迁移状态,我们删除并重新创建测试数据库。

这看起来像这样:

using (var sqlConnection = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True"))
{
    sqlConnection.Open();

    new SqlCommand("USE MASTER", sqlConnection).ExecuteNonQuery();

    try
    {
        new SqlCommand($"ALTER DATABASE [MyTestDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", sqlConnection).ExecuteNonQuery();
        new SqlCommand($"DROP DATABASE [MyTestDb]", sqlConnection).ExecuteNonQuery();
    }
    catch (SqlException e)
    {
        // We get an error if there is no database. This happens the very first time a test gets executed on a machine
    }

    new SqlCommand($"CREATE DATABASE [MyTestDb];", sqlConnection).ExecuteNonQuery();
    new SqlCommand($"ALTER DATABASE [MyTestDb] SET ALLOW_SNAPSHOT_ISOLATION ON;", sqlConnection).ExecuteNonQuery();
    new SqlCommand($"ALTER DATABASE [MyTestDb] SET READ_COMMITTED_SNAPSHOT  ON;", sqlConnection).ExecuteNonQuery();
}

using (var creationConnection = new SqlConnection(@$"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Initial Catalog=MyTestDb"))
{
    creationConnection.Open(); // <-- Problematic exception here

    using (var context = new MyDbContext(/*some DbContextOptions here... */))
    {
        context.Database.Migrate();
    }
}

这将在creationConnection.Open();上引发异常,并显示以下消息:

Microsoft.Data.SqlClient.SqlException(0x80131904):无法打开登录请求的数据库“ MyTestDb”。登录失败。用户“”登录失败。

如果在两个使用块之间添加Thread.Sleep(10_000);,将不会引发异常。

using (var sqlConnection = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True"))
{
    sqlConnection.Open();

    new SqlCommand("USE MASTER", sqlConnection).ExecuteNonQuery();

    try
    {
        new SqlCommand($"ALTER DATABASE [MyTestDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", sqlConnection).ExecuteNonQuery();
        new SqlCommand($"DROP DATABASE [MyTestDb]", sqlConnection).ExecuteNonQuery();
    }
    catch (SqlException e)
    {
        // We get an error if there is no Database. This happens the very first time a test gets executed on a machine
    }

    new SqlCommand($"CREATE DATABASE [MyTestDb];", sqlConnection).ExecuteNonQuery();
    new SqlCommand($"ALTER DATABASE [MyTestDb] SET ALLOW_SNAPSHOT_ISOLATION ON;", sqlConnection).ExecuteNonQuery();
    new SqlCommand($"ALTER DATABASE [MyTestDb] SET READ_COMMITTED_SNAPSHOT  ON;", sqlConnection).ExecuteNonQuery();
}

Thread.Sleep(10_000); // <-- exception will NOT be thrown 

using (var creationConnection = new SqlConnection(@$"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Initial Catalog=MyTestDb"))
{
    creationConnection.Open(); 

    using (var context = new MyDbContext(/*some DbContextOptions here... */))
    {
        context.Database.Migrate();
    }
}

我假设数据库MyTestDbcreationConnection.Open();上尚未准备好,并引发错误。

是否可以检查数据库创建是否完成?

c# sql-server unit-testing localdb ef-core-3.1
1个回答
0
投票

您可以执行以下操作:

SELECT [collation_name] FROM sys.databases WHERE name = 'MyTestDb';

如果collat​​ion_name具有值(不为null),则数据库处于联机状态。

© www.soinside.com 2019 - 2024. All rights reserved.