使用实体框架测试与SQL Server的连接
本文关键字:SQL Server 连接 测试 实体 框架 | 更新日期: 2023-09-27 18:03:54
在EntityFramework
以Code First
方式创建数据库之前,我需要验证Data Source
、UserId
和Password
。此时,无法读取任何用于测试连接的数据。我的目标是为产品配置connectionString,并为用户修改web.config
。因此,我需要一个方法来验证配置是否有效。特别是Data Source
、UserId
和Password
的精度。
所以,我希望测试SQL Server的连接,而SQL Server可能根本没有任何数据库。我需要测试连接能力,关于Data Source
、UserId
和Password
。如果某些参数无效,它应该向用户显示错误消息。
所以,我需要以下功能。
Data Source
、UserId
和Password
由用户输入决定- 没有创建额外的数据库。如果创建了任何用于测试的数据库,则应在最后将其删除
示例模型
我用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
组成。SqlConnection
是DbConnection
的子类,它接受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();
}