SQLサーバー2008でEF5.0を使用しています。同じサーバーインスタンス上に2つのデータベースがあります。私は両方のデータベースのテーブルを更新し、それらが同じトランザクションになるようにする必要があります。だから、私はTransactionScopeを使用しました。以下はコードです -MS DTCを使用しない同じサーバー上の複数のデータベース(datacontext)
public void Save()
{
var MSObjectContext = ((IObjectContextAdapter)MSDataContext).ObjectContext;
var AWObjectContext = ((IObjectContextAdapter)AwContext).ObjectContext;
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
MSObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
AWObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
scope.Complete();
}
}
上記のコードを使用すると、トランザクションがDTCに昇格されます。インターネットで検索したところ、これは2つの異なる接続文字列/接続のために発生することがわかりました。しかし、私が理解していないのは、(同じサーバー上の)別のデータベースのテーブルを更新するストアドプロシージャをあるデータベースに書き込んでDTCが必要ない場合です。では、なぜEFやTransactionScopeがこれをDTCに宣伝しているのですか?これのために他に何か回避策がありますか?
はプレーンDbConnection
Sが事前に
おかげ
サイ
私がコミットしたいです1つのトランザクションスコープで同じサーバー上の2つの完全に異なるdbs上のトランザクション。私はストアドプロシージャではできますが、EFではできません。あなたの答えをありがとう。 – Sai
私の答えは、格納されたprocsに頼らずに 'TransactionScope'を使ってそれを行う方法を示しています。 'tx.Complete()'行の後に現れる暗黙の 'tx.Dispose()は、2つの異なるデータベースへの両方のINSERTを包含する単一のトランザクションをコミットします。前述したように、EFでは、 'ChangeDatabase()'を手動で呼び出した接続を提供する方法がありますが、コードベースによっては、より結合したコードを生成する可能性があります(TransactionScoepのポイントはコードを切り離す)あなただけが知ることができます。 –
私はDatabaseFirstアプローチを使用していて、dbcontextがエンティティに緊密にバインドされているため、ChangeDatabase()を使用できないと思います。実行時に接続文字列を完全に異なるデータベースに変更すると、エラーがスローされます。 – Sai