Example #1
0
 public SessionReadOnlyScope(SessionScopeOption joiningOption, IsolationLevel?isolationLevel, ISessionFactory sessionFactory, IInterceptor sessionLocalInterceptor)
 {
     _internalScope = new SessionScope(joiningOption, true, isolationLevel, sessionFactory, sessionLocalInterceptor);
 }
        public SessionScope(SessionScopeOption joiningOption, bool readOnly, IsolationLevel?isolationLevel, ISessionFactory sessionFactory, IInterceptor sessionLocalInterceptor)
        {
            if (isolationLevel.HasValue && joiningOption == SessionScopeOption.JoinExisting)
            {
                throw new ArgumentException("Cannot join an ambient SessionScope when an explicit database transaction is required. When requiring explicit database transactions to be used (i.e. when the 'isolationLevel' parameter is set), you must not also ask to join the ambient context (i.e. the 'joinAmbient' parameter must be set to false).");
            }

            if (sessionFactory == null)
            {
                throw new ArgumentNullException(nameof(sessionFactory));
            }

            _disposed  = false;
            _completed = false;
            _readOnly  = readOnly;

            _parentScope = GetAmbientScope();
            if (_parentScope != null && joiningOption == SessionScopeOption.JoinExisting)
            {
                if (_parentScope._readOnly && !_readOnly)
                {
                    throw new InvalidOperationException("Cannot nest a read/write SessionScope within a read-only SessionScope.");
                }

                _nested  = true;
                _session = _parentScope._session;
            }
            else
            {
                _nested  = false;
                _session = new Lazy <ISession>(() => {
                    ISession session;

                    if (sessionLocalInterceptor == null)
                    {
                        session = sessionFactory.OpenSession();
                    }
                    else
                    {
                        session = sessionFactory.WithOptions()
                                  .Interceptor(sessionLocalInterceptor)
                                  .OpenSession();
                    }

                    if (readOnly)
                    {
                        // REVIEW WC
                        session.DefaultReadOnly = true;
                    }

                    if (isolationLevel.HasValue)
                    {
                        session.BeginTransaction(isolationLevel.Value);
                    }
                    else
                    {
                        session.BeginTransaction();
                    }

                    return(session);
                });
            }

            SetAmbientScope(this);
        }
Example #3
0
 public SessionReadOnlyScope(SessionScopeOption joiningOption, IsolationLevel?isolationLevel, ISessionFactory sessionFactory)
     : this(joiningOption, isolationLevel, sessionFactory, null)
 {
 }
Example #4
0
 public ISessionReadOnlyScope CreateReadOnly(SessionScopeOption joiningOption = SessionScopeOption.JoinExisting, IInterceptor sessionLocalInterceptor = null)
 {
     return(new SessionReadOnlyScope(joiningOption, null, _sessionFactory, sessionLocalInterceptor));
 }