EF 基於程式碼切換到不同資料庫的方法
阿新 • • 發佈:2018-11-16
最近寫專案一直在用EF , 跨庫能力極強. 很喜歡.
但是不能動態切換資料庫, 最近搞了一個配置中心的功能, 把連線字串放到配置中心中單獨配置管理.
但是EF預設是放到Web.config中的. 就算自己拼裝出了連線字串也會因為沒有 providerName=”System.Data.SqlClient” 而失敗.
經過再三研究, 今天研究了一下午終於搞定了.
關鍵是要過載 DbContext 的一個建構函式
public partial class DatacenterContext: DbContext
{
static DatacenterContext()
{
//DbConfiguration.SetConfiguration()
Database.SetInitializer< DatacenterContext>(null);
}
public DatacenterContext(DbConnection conn)
: base(conn, true)
{
//這個方法是用來實現切換不同庫的主方法.本身EF就提供的.
}
}
資料庫連線工廠, 的作用是在EF初始化之前先例項化一個新的資料庫連線. 然後用它例項化 EF 的 DbContext
public static class DBContextFactory
{
static string reportDBType = MK.Base.CenterConfig.GetConfig("資料庫型別");
static string dbip = MK.Base.CenterConfig.GetConfig("資料庫IP地址");
static string dbport = MK.Base.CenterConfig.GetConfig("資料庫埠");
static string dbuser = MK.Base.CenterConfig.GetConfig("資料庫使用者名稱" );
static string dbpassword = MK.Base.CenterConfig.GetConfig("資料庫密碼");
static string dbname = MK.Base.CenterConfig.GetConfig("資料庫名或(Orcale)服務名");
/// <summary>
/// 根據配置取得資料庫連線上下文
/// </summary>
/// <returns></returns>
public static DbContext GetReportDataDbContext()
{
if (reportDBType == "DataCenter_MySql")
{
MySqlConnectionStringBuilder sqlbulider = new MySqlConnectionStringBuilder();
sqlbulider.Server = dbip;
sqlbulider.UserID = dbuser;
sqlbulider.Password = dbpassword;
sqlbulider.Database = dbname;
sqlbulider.Port = uint.Parse(dbport);
sqlbulider.AllowZeroDateTime = true;
sqlbulider.ConvertZeroDateTime = true;
sqlbulider.IntegratedSecurity = true;
MySqlConnection conn = new MySqlConnection(sqlbulider.ToString());
return new DatacenterContext( conn );
}
else if (reportDBType == "DataCenter_SqlServer")
{
connectstring = string.Format("Data Source={0},{4};Initial Catalog={3};Persist Security Info=True;User ID={1};Password={2};", dbip, dbuser, dbpassword, dbname, dbport);
SqlConnectionStringBuilder sqlbulider = new SqlConnectionStringBuilder();
sqlbulider.DataSource = dbip+","+ uint.Parse(dbport);
sqlbulider.UserID = dbuser;
sqlbulider.Password = dbpassword;
sqlbulider.UserID = dbname;
sqlbulider.InitialCatalog = dbname;
sqlbulider.PersistSecurityInfo = true;
sqlbulider.IntegratedSecurity = true;
SqlConnection conn = new SqlConnection(sqlbulider.ToString());
return new DatacenterContext(conn);
}
}
}