請參閱下面的代碼。如果我初始化多個實體上下文,那麼我在第二組代碼上得到以下例外。如果我註釋掉第二組,它就可以工作。爲什麼TransactionScope不能與實體框架一起使用?
{ 「底層提供對打開失敗。」}
內:{ 「與基礎事務管理器通信失敗。」}
內:{「錯誤HRESULT E_FAIL已退還從一個COM組件調用。「}
請注意,這是一個示例應用程序,我知道它沒有意義在一行中創建2個上下文。但是,生產代碼確實有理由在同一個TransactionScope
中創建多個上下文,並且這是不能更改的。
編輯
這裏是我試圖建立MS-DTC前一個問題。它似乎在服務器和客戶端都啓用。我不確定它是否設置正確。另外請注意,我試圖這樣做的原因之一是TransactionScope
中的現有代碼使用ADO.NET和Linq 2 Sql ...我希望那些也使用相同的事務。 (這可能聽起來很瘋狂,但如果可能的話我需要使它工作)。
How do I use TransactionScope in C#?
解
Windows防火牆擋住到MS-DTC的連接。
using(TransactionScope ts = new System.Transactions.TransactionScope())
{
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
var v = (from s in o.Advertiser select s).First();
v.AcceptableLength = 1;
o.SaveChanges();
}
//-> By commenting out this section, it works
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
//Exception on this next line
var v = (from s1 in o.Advertiser select s1).First(); v.AcceptableLength = 1;
o.SaveChanges();
}
//->
ts.Complete();
}
我不只是使用實體框架,因此重複使用EntityConnection也不是一個簡單的解決方案(請參閱上面的編輯) – NotDan 2009-04-27 19:01:07
+1用於避免DTC。這並不是壞事,只是分佈式交易不是輕易選擇的東西。這是應用程序和資源的緊密鏈接,可能會降低設計的可用性。 – 2009-04-27 19:48:43
您也可以調用context.Connection.Open()手動管理它。你不需要手動創建EntityConnection – 2009-12-24 16:41:23