コード例 #1
0
 public SessionReadOnlyScope(SessionScopeOption joiningOption, IsolationLevel?isolationLevel, ISessionFactory sessionFactory, IInterceptor sessionLocalInterceptor)
 {
     _internalScope = new SessionScope(joiningOption, true, isolationLevel, sessionFactory, sessionLocalInterceptor);
 }
コード例 #2
0
        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);
        }
コード例 #3
0
 public SessionReadOnlyScope(SessionScopeOption joiningOption, IsolationLevel?isolationLevel, ISessionFactory sessionFactory)
     : this(joiningOption, isolationLevel, sessionFactory, null)
 {
 }
コード例 #4
0
 public ISessionReadOnlyScope CreateReadOnly(SessionScopeOption joiningOption = SessionScopeOption.JoinExisting, IInterceptor sessionLocalInterceptor = null)
 {
     return(new SessionReadOnlyScope(joiningOption, null, _sessionFactory, sessionLocalInterceptor));
 }