3

「EntityConnection只能使用封閉的DbConnection構建」 這是我嘗試構建提供開放式連接的實體連接時遇到的問題。 有一個事務處理器打開,我不想打開一個新的連接,或者事務將被提升爲一個dtc事務處理,因爲我的理解是,如果我通過多個entityConnections使用單個SqlConnection,我不需要DTC。EntityConnection只能使用封閉的DbConnection構建

所以,我的代碼大致是這樣的。

在此先感謝...

using (TransactionScope transactionScope = new TransactionScope()) 
{ 

    using (SqlConnection dwConn = GetDWConnection(user)) 
    { 
     dwConn.Open(); 
     // I need to do some SQlConnection specific actions first 

     //EntityConnection specific actions next 
     Func1(dwConn); 
     Func2(dwConn); //similar to Func1() 
     Func3(dwConn); //Similar to Func1() 

    } 

} 
    Func1(SqlConnection dwConn) 
    { 
     using (EntityConnection conn = GetSQLEntityConnection(sqlConnection)) 
     { 
      ObjectContext objectContext = (ObjectContext)Activator.CreateInstance(objectContextType, new object[] { conn }); 
      //few actions 
     } 
    } 
    private EntityConnection GetSQLEntityConnection(SqlConnection sqlConnection) 
     { 
     //few steps 
      EntityConnection entityConnection = new EntityConnection(entityConnectionStringBuilder.ToString()); 

      EntityConnection sqlEntityConnection = new EntityConnection(entityConnection.GetMetadataWorkspace(),sqlConnection); 
      return sqlEntityConnection; 
     } 
+0

爲什麼不傳遞相同的'ObjectContext'實例? – Eranga

回答

0

正如你已經發現了,你不能創建從一個打開連接的新EntityConnection

而不是通過SqlConnection周圍,並創建EntityConnection一遍又一遍,你應該重構你的代碼,並通過ObjectContext來代替。 ObjectContext是EF中的根對象,您應該優先於SqlConnection

2

Jakub是完全正確的。您可以創建既沒有DbContext也沒有EntityConnection與打開DbConnection傳遞給他們。

根據Diego B Vega’s post這個問題將不會被固定,直到EF 6版(here你可以爲它投票)

解決方法是打開之前就已經涉及任何操作初始化EntityConnection

鑑於ObjectContext可以打開EntityConnection這樣的:

((EntityConnection)objectContext.Connection).Open(); 

DbContextEntityConnection情況下,可從根本ObjectContext。代碼可能是這樣的:

class MyDbContext : DbContext 
{ 
    public MyDbContext (DbConnection connection) 
        : base (connection, contextOwnsConnection: true) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.Connection.Open(); 
    } 

    // … 
} 

class Program 
{ 
    public static void Main() 
    { 
     var connection = new SqlConnection(CONNECTION_STRING); 
     using (var database = new MyDbContext(connection)) 
     { 
      Assert.IsTrue(connection.State == ConnectionState.Open); 
     } 
     Assert.IsTrue(connection.State == ConnectionState.Closed); 
    } 
}