使用实体框架测试与SQL Server的连接

本文关键字:SQL Server 连接 测试 实体 框架 | 更新日期: 2023-09-27 18:03:54

EntityFrameworkCode First方式创建数据库之前,我需要验证Data SourceUserIdPassword。此时,无法读取任何用于测试连接的数据。我的目标是为产品配置connectionString,并为用户修改web.config。因此,我需要一个方法来验证配置是否有效。特别是Data SourceUserIdPassword的精度。

所以,我希望测试SQL Server的连接,而SQL Server可能根本没有任何数据库。我需要测试连接能力,关于Data SourceUserIdPassword。如果某些参数无效,它应该向用户显示错误消息。

所以,我需要以下功能。

  1. Data SourceUserIdPassword由用户输入决定
  2. 没有创建额外的数据库。如果创建了任何用于测试的数据库,则应在最后将其删除

使用实体框架测试与SQL Server的连接

示例模型

我用EntityFramework编写了一个简单的Database model,创建它来测试,并在最后删除数据库。connectionString是由程序组成的,因此TestDbContext应该接受DbConnection参数。

public class Test
{
    public long Id { get; set; }
    public string Field { get; set; }
}
public class TestDbContext : DbContext
{
    public DbSet<Test> TestSet { get; set; }
    public TestDbContext() {}
    /// For self-composed connection string.
    public TestDbContext(DbConnection conn) : base(conn, true) {}
}

编写连接字符串

然后,connectionString可以由用于System.Data.SqlClient数据提供者的SqlConnectionStringBuilder组成。SqlConnectionDbConnection的子类,它接受sb生成的字符串。

SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder();
sb.DataSource = ...; //< The `Data Source` parameter
// The `InitialCatalog` parameter.
// Create an unique database for testing. And avoid name confliction.
sb.InitialCatalog = "testing" + Guid.NewGuid().ToString("N"); 
sb.UserID = ...; //< The `UserId`
sb.Password = ...; //< The `Password` of `UserId`.
sb.MultipleActiveResultSets = true;
SqlConnection dbConn = new SqlConnection(sb.ToString());
// dbConn.Open(); 
// It will be failed when the database had not been created.
// But, I need to verify the db server, account and password, 
// no matter whether the database is created or not.

测试连接

然后,通过EntityFramework测试连接。它非常方便。

// Test by self-composed connection string.
using (TestDbContext db = new TestDbContext(dbConn))
{
    // Create database. 
    // If failed to connect to the database server, it will throw an exception.
    db.Database.CreateIfNotExists();
    // Insert an item.
    var item = new Test() { Field="Hello World!!"};
    db.TestSet.Add(item);
    db.SaveChanges();
    // Delete database after testing
    db.Database.Delete();
}