2014-10-17 119 views
1

我有功能與類似下面的代碼:錯誤:底層提供程序在打開時失敗。如何解決它?

using(var db = new MyDbContext()) 
{ 
    //a whole bunch of code, db is working. 

    //then I try opening another DbContext like so 
    using(var dba = new AnotherDbContext()) 
    { 
     //about 2 lines of code just to get something from a database 
    } 
} 

然後我得到2個錯誤消息,當我到了第二的DbContext:

「基礎供應商未能打開。」 「&」服務器'myserver'上的MSDTC不可用。「

有誰知道爲什麼發生這種情況的原因嗎?我可以一次打開2個DbContext嗎?

+2

埃姆,混合兩個上下文/數據庫/不管在一般而言,單一方法在編程中通常是一個非常糟糕的主意。爲什麼你需要這樣做?聽起來像一個壞的建築設計那麼遠,我 – walther 2014-10-17 21:20:29

+0

使用一個數據庫來存儲我可以在我所有的項目都使用加拿大郵政信息。 @walther – habsNation2424 2014-10-20 16:28:15

回答

2

在第一種情況下,你嵌套AnotherDbContext。連接到數據庫的每個連接都會打開。當您在使用塊內調用你的服務方法,一個新的連接的MyDbContextwhile內開有另外一個已經打開。 這將導致您的交易將被提升到一個分佈式事務,以及部分提交數據不是從你的外表connection.Also注意,分佈式(在dba.SaveChanges呼叫服務的結果)交易是慢得多,因此這具有降低性能的副作用。

private void btnTwoConnectionsNested_Click(object sender, EventArgs e) 
{ 
    string connectionString = @"Data Source=" + tbServer.Text 
     + @";Initial Catalog=master;Integrated Security=True; timeout=0"; 

    using (TransactionScope transactionScope = new TransactionScope()) 
    { 
     SqlConnection connectionOne = new SqlConnection(connectionString); 
     SqlConnection connectionTwo = new SqlConnection(connectionString); 

     try 
     { 
      //2 connections, nested 
      connectionOne.Open(); 
      connectionTwo.Open(); // escalates to DTC on 05 and 08 
      connectionTwo.Close(); 
      connectionOne.Close(); 

      MessageBox.Show("Success"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("ERROR: " + ex.Message); 
     } 
     finally 
     { 
      connectionOne.Dispose(); 
      connectionTwo.Dispose(); 
     } 
    } 
} 

在一個事務範圍內,它將打開兩個連接,嵌套。 結果:

針對SQL Server 2005實例: 服務器「SERVERNAME」上的MSDTC不可用。

針對SQL Server 2008實例:
服務器「SERVERNAME」上的MSDTC不可用。

SQL Server會,而且應該升級到DTC的兩個版本中的嵌套連接。

嵌套式連接將升級爲DTC在SQL Server 2005和2008年開放一次一個連接將升級爲DTC於2005年,但不會在2008年