/// <summary> /// Enlists if necessary. /// </summary> /// <param name="weAreSessionOwner">if set to <c>true</c> [we are session owner].</param> /// <param name="transaction">The transaction.</param> /// <param name="session">The session.</param> /// <returns></returns> protected bool EnlistIfNecessary(bool weAreSessionOwner, ITransaction transaction, SessionDelegate session) { if (transaction == null) { return(false); } var list = (IList <ISession>)transaction.Context["nh.session.enlisted"]; bool shouldEnlist; if (list == null) { list = new List <ISession>(); shouldEnlist = true; } else { shouldEnlist = true; foreach (ISession sess in list) { if (SessionDelegate.AreEqual(session, sess)) { shouldEnlist = false; break; } } } if (shouldEnlist) { if (session.Transaction == null || !session.Transaction.IsActive) { transaction.Context["nh.session.enlisted"] = list; IsolationLevel level = TranslateIsolationLevel(transaction.IsolationMode); transaction.Enlist(new ResourceAdapter(session.BeginTransaction(level), transaction.IsAmbient)); list.Add(session); } if (weAreSessionOwner) { transaction.RegisterSynchronization(new SessionDisposeSynchronization(session)); } } return(true); }