1. 程式人生 > >EF 基於程式碼切換到不同資料庫的方法

EF 基於程式碼切換到不同資料庫的方法

最近寫專案一直在用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); } } }