Exemple #1
0
        public virtual IDbConnection CreateDbConnection(string connectionString, IDbConnectionResolver connectionResolver, string connectionProviderName)
        {
            IDbConnection dbConnection = null;

            var activeTransaction = this.GetActiveTransactionInfo(connectionString);

            if (activeTransaction == null)
            {
                dbConnection = connectionResolver.Resolve(connectionString, this.Options, connectionProviderName);
                var dbTransaction = dbConnection.BeginTransaction(
                    (Options.IsolationLevel ?? System.Transactions.IsolationLevel.ReadUncommitted).ToSystemDataIsolationLevel()
                    );
                activeTransaction = new ActiveTransactionInfo(dbTransaction, dbConnection);
                ActiveTransactions[connectionString] = activeTransaction;
            }

            return(dbConnection);
        }
        public virtual DbContext CreateDbContext(string connectionString, IDbContextResolver dbContextResolver, string dbContextProviderName)
        {
            DbContext dbContext;

            var activeTransaction = ActiveTransactions.GetOrDefault(connectionString);

            if (activeTransaction == null)
            {
                dbContext = dbContextResolver.Resolve(connectionString, null, this.Options, dbContextProviderName);

                // 缓存模型
                _contextModelStorage.AddOrUpdate(connectionString, dbContext.Model);


                var dbtransaction = dbContext.Database.BeginTransaction((Options.IsolationLevel ?? IsolationLevel.ReadUncommitted).ToSystemDataIsolationLevel());
                activeTransaction = new ActiveTransactionInfo(dbtransaction, dbContext);
                ActiveTransactions[connectionString] = activeTransaction;
            }
            else
            {
                dbContext = dbContextResolver.Resolve(
                    connectionString,
                    activeTransaction.DbContextTransaction.GetDbTransaction().Connection,
                    this.Options,
                    dbContextProviderName
                    );

                if (dbContext.HasRelationalTransactionManager())
                {
                    dbContext.Database.UseTransaction(activeTransaction.DbContextTransaction.GetDbTransaction());
                }
                else
                {
                    dbContext.Database.BeginTransaction();
                }

                activeTransaction.AttendedDbContexts.Add(dbContext);
            }

            return(dbContext);
        }