/// <summary>
        /// Disposes ambient database context.
        /// </summary>
        public void Dispose()
        {
            var immutableStack = _storageHelper.GetStack();

            // This can only happen if the consumer of the library is messing with the storage.
            if (immutableStack.IsEmpty)
            {
                throw new AmbientDbContextException("Could not dispose ambient database context because it does not exist in storage.");
            }

            var topItem = immutableStack.Peek();

            if (this != topItem)
            {
                throw new InvalidOperationException("Could not dispose ambient database context because it is not the active ambient database context. This could occur because ambient database context is being disposed out of order.");
            }

            immutableStack = immutableStack.Pop();

            _storageHelper.SaveStack(immutableStack);

            if (Parent == null)
            {
                if (Connection?.State == ConnectionState.Open)
                {
                    Connection.Close();
                    Connection.Dispose();

                    Connection = null;
                }
            }
        }
        /// <summary>
        /// Initializes the underlying contextual storage.
        /// </summary>
        /// <returns>
        /// The immutable stack containing active ambient database contexts.
        /// </returns>
        private IImmutableStack <IAmbientDbContext> PrepareStorageAndStack()
        {
            var storage = AmbientDbContextStorageProvider.Storage;

            _storageHelper = new ContextualStorageHelper(storage);

            return(_storageHelper.GetStack());
        }
Exemple #3
0
        /// <summary>
        /// Retrieves active ambient database context from the storage.
        /// </summary>
        /// <returns>
        /// The active <see cref="IAmbientDbContextQueryProxy"/> instance.
        /// </returns>
        /// <exception cref="AmbientDbContextException">
        /// when the contextual storage does not contain an active ambient database context.
        /// </exception>
        public IAmbientDbContextQueryProxy Get()
        {
            var immutableStack = _storageHelper.GetStack();

            if (immutableStack.IsEmpty)
            {
                throw new InvalidOperationException("Could not find active ambient database context instance. Use AmbientDbContextFactory to create ambient database context before attempting to execute queries.");
            }

            return((IAmbientDbContextQueryProxy)immutableStack.Peek());
        }