private void DoReadOnlyTransaction([NotNull] Action <ISession> procedure, [CanBeNull] IDetachedState detachedState) { using (ISession session = OpenSession()) { // Do not set session.DefaultReadOnly = true; // otherwise the loaded entities remain readonly forever // -> this probably makes sense but would be a change in behaviour AssertRequiredContext(session, RequiredContext.Transaction); FlushMode origFlushMode = session.FlushMode; session.FlushMode = FlushMode.Manual; try { detachedState?.ReattachState(this); procedure(session); } finally { session.FlushMode = origFlushMode; //session.DefaultReadOnly = false; session.Transaction.Rollback(); session.BeginTransaction(); } } }
private void Do([NotNull] Action <ISession> procedure, RequiredContext requiredContext, [CanBeNull] IDetachedState detachedState) { using (ISession session = OpenSession()) { AssertRequiredContext(session, requiredContext); detachedState?.ReattachState(this); try { procedure(session); } catch (Exception e) { // Roll back, if this is the outermost transaction if (session is SessionWrapper sessionWrapper && sessionWrapper.IsOutermost) { _msg.Debug("Rolling back nHibernate transaction due to exception.", e); session.Transaction.Rollback(); } throw; } } }
public void NewTransaction(IDetachedState detachedState, Action procedure) { Assert.ArgumentNotNull(procedure, nameof(procedure)); AssertNoExistingTransaction(); Do(delegate { procedure(); }, RequiredContext.Transaction, detachedState); }
public void ReattachState(IDetachedState detachedState) { Assert.ArgumentNotNull(detachedState, nameof(detachedState)); detachedState.ReattachState(_unitOfWork); }
public void ReattachState(IDetachedState detachedState) { }
public void ReadOnlyTransaction(IDetachedState detachedState, Action procedure) { Assert.ArgumentNotNull(procedure, nameof(procedure)); DoReadOnlyTransaction(delegate { procedure(); }, detachedState); }