[C#][Entity Framework]DataBase First開發模式下,動態切換不同連線字串

  • 1696
  • 0

由於程式必須在測試資料庫跟正式資料庫之間做切換,在使用Entity Framework 6連資料庫時,怎樣才可以切換資料庫連線字串呢?

在此使用Database first模式開發Entity Framework 6程式,
首先創造一個實體資料模型檔,名稱為Model1.edmx,
在Model1.edmx內的Model1.Context.cs檔案內,
可以找到DbContext的建構函式如下圖(圖片用新分頁開啟會比較大):
預設的DbContext建構式無法傳入連線字串,
因此,必須自行再多載一個同名的建構函式,改成可以傳入連線字串,
但是不可以在這個檔案直接新增程式碼,
因為這個檔案是由Entity Framework自動產生的,
所以要新增一個.cs檔,用partial class的方式加入多載的建構函式如下:
接著在App.Config檔中找到連線字串如下圖,
圖中名為「DemoDbContext」是預設產生的連線字串,
複製此連線字串並修改名稱為「TestDemoDbContext」(作為測試機的連線字串)
以及修改連線字串裡的data source、initial catalog、user id、password...等資料。

之後再撰寫切換連線字串的程式碼即可,程式碼如下:

public partial class Form1 : Form
{
   //在此切換連線字串
   ConnectionSelecter _ConnectionSelecter = ConnectionSelecter.Test;


   public Form1()
   {
      InitializeComponent();
   }
  

   private void Form1_Load(object sender, EventArgs e)
   {
       using (DemoDbContext mydb = CreateDbContext(_ConnectionSelecter))
       {
           //取得資料庫資料(GauItems是資料庫資料表的名稱)
           var query = mydb.GauItems.Select(s => s);
           //資料放入dataGridView內顯示出來
           this.dataGridView1.DataSource = query.ToList();
       }
   }
        
   private DemoDbContext CreateDbContext(ConnectionSelecter connectionSelecter)
   {
       switch (connectionSelecter)
       {
           //測試機連線
           case ConnectionSelecter.Test:
               return  new DemoDbContext("name=TestDemoDbContext");

           //正式機連線
           case ConnectionSelecter.Client:
               return new DemoDbContext();
           
           //預設為正式機連線
           default:
               return new DemoDbContext();
       }
    }
        

}


public enum ConnectionSelecter
{
    /// <summary>
    /// 測試機
    /// </summary>
    Test,

    /// <summary>
    /// 正式機
    /// </summary>
    Client
}

到此完成切換連線字串。

若需要將連線字串加密,可以參考「黑暗執行緒:為EF連線字串加密的簡單範例」。