namespace HW.Utility.Data { using System; using System.Collections.Generic; using System.Data.Common; using System.Transactions; internal static class TransactionScopeConnections { private static Dictionary> transactionConnections = new Dictionary>(); public static DbConnection GetConnection(Database db) { Dictionary dictionary; DbConnection newOpenConnection; Transaction current = Transaction.Current; if (current == null) { return null; } transactionConnections.TryGetValue(current, out dictionary); if (dictionary != null) { dictionary.TryGetValue(db.ConnectionString.ToString(), out newOpenConnection); if (newOpenConnection != null) { return newOpenConnection; } } else { dictionary = new Dictionary(); lock (transactionConnections) { transactionConnections.Add(current, dictionary); } } if (dictionary.ContainsKey(db.ConnectionString)) { newOpenConnection = dictionary[db.ConnectionString]; } else { newOpenConnection = db.GetNewOpenConnection(); current.TransactionCompleted += new TransactionCompletedEventHandler(TransactionScopeConnections.OnTransactionCompleted); dictionary.Add(db.ConnectionString, newOpenConnection); } return newOpenConnection; } private static void OnTransactionCompleted(object sender, TransactionEventArgs e) { Dictionary dictionary; transactionConnections.TryGetValue(e.Transaction, out dictionary); if (dictionary != null) { lock (transactionConnections) { transactionConnections.Remove(e.Transaction); } foreach (DbConnection connection in dictionary.Values) { connection.Dispose(); } } } } }