public new void Dispose() { base.Dispose(); var memento = _ambientDbContextHouseKeeper.Memento; CallContextContextData.AddContextData(ContextKey, memento.ContextData); }
internal virtual void Initialize() { _savedContextData = null; var contextData = CallContextContextData.GetContextData(); if (contextData == null) { Debug.WriteLine("Creating a new DbContext"); contextData = ContextData.CreateContextData <T>(_mode, _isolationLevel, _dbTransaction, _sqlConnection); _isParentScope = true; } else { _isParentScope = false; var dbcontext = contextData.GetDbContextByType <T>(); if (dbcontext == null) { Debug.WriteLine("Creating a new DbContext"); contextData.CreateNewDbContextIfNotExists <T>(_mode, _isolationLevel, _dbTransaction, _sqlConnection); } else { Debug.WriteLine("DbContext exists in CallContext, just re-using it"); if (_isolationLevel != null && _isolationLevel != IsolationLevel.ReadCommitted && contextData.IsolationLevel != _isolationLevel) { throw new InvalidOperationException("Cannot change the isolation level on an Ambient transaction"); } if (dbcontext.Mode == DbContextOption.Mode.Read && _mode == DbContextOption.Mode.Write) { throw new InvalidOperationException("Cannot nested read/write when parent is in read mode"); } } } _savedContextData = contextData; //Check the callcontext to see if there is an existing context data. contextData = CallContextContextData.GetContextData(); //Add the context data back to the CallContext with new context key if (contextData == null) { CallContextContextData.AddContextData(ContextKey, _savedContextData); } }