2

在EF6 DB First方法和某些ADO操作中所做的操作之間是否可以共享一個連接(以及事務)?實體框架6數據庫優先 - 如何與ADO共享連接和事務

當我在這裏閱讀:https://msdn.microsoft.com/en-us/data/dn456843.aspx#existing 自EF v6以來就可以共享連接和事務,但我必須將SqlConnection對象作爲參數傳遞給上下文類的構造函數。 但是,如果我在數據庫優先方法中這樣做,我有UnintentionalCodeFirstException。

當我在這裏讀取:https://msdn.microsoft.com/en-us/data/jj592674 當使用DB First方法時,我必須使用EntityConnection的實例作爲上下文類的構造函數的參數。但是EntityConnection類的構造函數只接受CLOSED連接。 因此,我不能共享事務,因爲連接必須在傳遞到上下文類之前關閉。

我是否正確,在這種情況下共享一個連接是不可能的,或者有其他方法?

是TransactionScope仍然是唯一的方法來包裝操作在EF 6 DB第一次和ADO在一個事務(單獨的連接)?

+0

您能詳細介紹一下爲什麼要分享連接嗎? –

+0

@RobTillie在我使用的應用程序中,部分代碼仍然使用ADO,其他部分使用EF。我想在事務中將操作包裝在EF和ADO中。 TransactionScope有一些限制,MS建議使用一種連接方法。連接越少越好。 – wlodziu

+0

你可以用反射來破解這個。我用ef和sqlbulkcopy完成了這個。現在可以複製代碼。 –

回答

0

我不記得我從哪裏得到這個信息,但它幫助我在同一交易中運行EFSqlBulkCopy。以下是如何從Entity Framework獲取交易:

EntityConnection ec = (EntityConnection)Context.Connection; 
SqlConnection sc = (SqlConnection)ec.StoreConnection; 
SqlTransaction sqlTransaction = null; 

var parserProp = sc.GetType().GetProperty("Parser", BindingFlags.NonPublic | BindingFlags.Instance); 

if (parserProp != null) 
{ 
    var parser = parserProp.GetValue(sc, null); 
    var sqltxProp = parser.GetType().GetProperty("CurrentTransaction", BindingFlags.NonPublic | BindingFlags.Instance); 
    var currentTransaction = sqltxProp.GetValue(parser, null); 
    sqlTransaction = currentTransaction as SqlTransaction; 

    if (sqlTransaction == null) 
    { 
     var parentProp = currentTransaction.GetType().GetProperty("Parent", BindingFlags.NonPublic | BindingFlags.Instance); 
     currentTransaction = parentProp.GetValue(currentTransaction, null); 
     sqlTransaction = currentTransaction as SqlTransaction; 
    } 
} 
相關問題