2013-01-09 49 views
3

我想將兩個不同的代碼片段集成到使用相同的事務中。一個是Oracle上的實體框架(使用odp.net作爲驅動程序),另一個是使用odp.net的標準ado.net。兩者都使用相同的連接字符串。使用EntityFramework和ado.net存儲過程的相同事務

實現此目的的正確方法是什麼?

我可以通過使用context.Connection.BeginTransaction()啓動EF事務,但是這讓我回到System.Data.Common.DbTransaction。

我可以直接使用odp.net嗎?由於涉及DTC的所有困難,我不想使用TransactionScope。

有很多原因,我不能只是簡單地使用EF來訪問這個存儲過程(我們正在使用EF的一些自定義的T4模板,此時不支持存儲過程)。

回答

3

嗯,我想通了。

這裏是我做的:

使用實體框架之前,我做:

Context.Connection.Open(); 
var ts = Context.Connection.BeginTransaction(); 

然後我做的東西與EF對象和調用的SaveChanges()。

對於ADO.NET,我做了以下(只是舉個例子,不生產代碼!):

var conn = ((EntityConnection)dal.Context.Connection).StoreConnection; 

    var cmd2 = conn.CreateCommand(); 
    cmd2.CommandText = "insert into tst_rob values ('3')"; 
    cmd2.ExecuteNonQuery(); 

美中不足的是鑄造Context.Connection到EntityConnection才能夠得到一個底層連接。

最後我做ts.Commit()或ts.Rollback()。瞧,沒有涉及DTC,所有人都在同一筆交易。