public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);

                //TODO: Object materialize event
                //TODO: Apply current filters to this dbcontext

                if (Options.IsTransactional == true)
                {
                    BeginTransaction(dbContext);
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #2
0
        /// <summary>
        /// 获取或创建数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文对象</typeparam>
        /// <param name="multiTenancySide">多租户双方中的一方</param>
        /// <returns>数据库上下文对象</returns>
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);

                ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                {
                    ObjectContext_ObjectMaterialized(dbContext, args);
                };

                FilterExecuter.As <IEfUnitOfWorkFilterExecuter>().ApplyCurrentFilters(this, dbContext);

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : EfCoreDbContextBase
        {
            var concreteDbContextType = typeof(TDbContext);

            var connectionString = base.ConnectionStringResolver.GetNameOrConnectionString();

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            EfCoreDbContextBase dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = TransactionStrategy.CreateDbContext <TDbContext>(connectionString, DbContextResolver);
                }
                else
                {
                    dbContext = DbContextResolver.Resolve <TDbContext>(connectionString, null);
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);
                //((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                //{
                //    ObjectContext_ObjectMaterialized(dbContext, args);
                //};

                //foreach (var filter in Filters)
                //{
                //    if (filter.IsEnabled)
                //    {
                //        dbContext.EnableFilter(filter.FilterName);
                //    }
                //    else
                //    {
                //        dbContext.DisableFilter(filter.FilterName);
                //    }

                //    foreach (var filterParameter in filter.FilterParameters)
                //    {
                //        if (TypeHelper.IsFunc<object>(filterParameter.Value))
                //        {
                //            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, (Func<object>)filterParameter.Value);
                //        }
                //        else
                //        {
                //            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, filterParameter.Value);
                //        }
                //    }
                //}

                if (Options.IsTransactional == true)
                {
                    BeginTransaction(dbContext);
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #5
0
 private void DisposeUow()
 {
     foreach (var context in ActiveDbContexts.Values)
     {
         context.Dispose();
         iocResolver.Release(context);
     }
     ActiveDbContexts.Clear();
 }
예제 #6
0
 public virtual void AddDbContext(string name, NamedDbContext dbContext)
 {
     if (ActiveDbContexts.ContainsKey(name))
     {
         return;
     }
     ActiveDbContexts.Add(name, dbContext);
     _dbContextAddedEvent(dbContext);
 }
예제 #7
0
        protected override void DisposeUow()
        {
            ActiveDbContexts.Values.ForEach(Release);
            ActiveDbContexts.Clear();

            if (CurrentTransaction != null)
            {
                CurrentTransaction.Dispose();
                CurrentTransaction = null;
            }
        }
예제 #8
0
        protected override void DisposeUow()
        {
            if (SharedTransaction != null)
            {
                SharedTransaction.Dispose();
                SharedTransaction = null;
            }

            GetAllActiveDbContexts().ForEach(Release);
            ActiveDbContexts.Clear();
        }
예제 #9
0
        public virtual NamedDbContext GetDbContext(string name)
        {
            if (!ActiveDbContexts.ContainsKey(name))
            {
                return(null);
            }
            NamedDbContext context;

            ActiveDbContexts.TryGetValue(name, out context);
            return(context);
        }
예제 #10
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : DbContext
        {
            //todo: 区分oracle和sqlserver数据库

            //var connectionString = "DefaultConnection";

            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            string connectionString;
            string schema = null;

            if (DbConnectionHelper.DbCatagory == DBType.Oracle.ToString())
            {
                connectionString = ResolveConnectionString(ref schema);
                connectionString = "Oracle";
            }
            else
            {
                connectionString = ResolveConnectionString();
            }
            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    //解析出来的是TransactionScopeEfTransactionStrategy
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString, _dbContextResolver, schema);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);
                }

                DbContexts.Add(dbContext);

                //if (Options.Timeout.HasValue && !dbContext.Database.CommandTimeout.HasValue)
                //{
                //    dbContext.Database.CommandTimeout = Options.Timeout.Value.TotalSeconds.To<int>();
                //}

                ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                {
                    ObjectContext_ObjectMaterialized(dbContext, args);
                };

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #11
0
        protected override void DisposeUow()
        {
            if (Options.IsTransactional == true)
            {
                _transactionStrategy.Dispose(IocResolver);
            }
            else
            {
                GetAllActiveDbContexts().ForEach(Release);
            }

            ActiveDbContexts.Clear();
        }
예제 #12
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null, string name = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            if (name != null)
            {
                dbContextKey += "#" + name;
            }

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString, _dbContextResolver);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);
                }

                if (Options.Timeout.HasValue && !dbContext.Database.CommandTimeout.HasValue)
                {
                    dbContext.Database.CommandTimeout = Options.Timeout.Value.TotalSeconds.To <int>();
                }

                if (Clock.SupportsMultipleTimezone)
                {
                    ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                    {
                        ObjectContext_ObjectMaterialized(dbContext, args);
                    };
                }

                FilterExecuter.As <IEfUnitOfWorkFilterExecuter>().ApplyCurrentFilters(this, dbContext);

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #13
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext, TEntity>(MultiTenancySides?multiTenancySide = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);
            var entityAssemblyId = typeof(TEntity).Assembly.GetName().Name;

            if (!entityConfigurations.Any(e => string.Equals(e.EntityModule, entityAssemblyId, StringComparison.OrdinalIgnoreCase)))
            {
                throw new BlocksDBORMException(StringLocal.Format($"{entityAssemblyId} not found in EntityConfigurations."));
            }
            var moduleName   = entityAssemblyId; //extensionManager.GetExtension(typeof(TEntity).Assembly.GetName().Name).Name;
            var dbContextKey = moduleName + "#" + concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString, _dbContextResolver, moduleName);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString, moduleName);
                }

                if (Options.Timeout.HasValue && !dbContext.Database.GetCommandTimeout().HasValue)
                {
                    dbContext.Database.SetCommandTimeout(SafeConvert.ToInt32(Options.Timeout.Value.TotalSeconds));
                }

                //TODO ObjectMaterialize
                //((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                //{
                //    ObjectContext_ObjectMaterialized(dbContext, args);
                //};

                // FilterExecuter.As<IEfUnitOfWorkFilterExecuter>().ApplyCurrentFilters(this, dbContext);

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #14
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null)
            where TDbContext : DbContext
        {
            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"] = typeof(TDbContext);
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = typeof(TDbContext).FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);

                ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                {
                    ObjectContext_ObjectMaterialized(dbContext, args);
                };

                foreach (var filter in Filters)
                {
                    if (filter.IsEnabled)
                    {
                        dbContext.EnableFilter(filter.FilterName);
                    }
                    else
                    {
                        dbContext.DisableFilter(filter.FilterName);
                    }

                    foreach (var filterParameter in filter.FilterParameters)
                    {
                        if (TypeHelper.IsFunc <object>(filterParameter.Value))
                        {
                            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, (Func <object>)filterParameter.Value);
                        }
                        else
                        {
                            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, filterParameter.Value);
                        }
                    }
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #15
0
 protected override void DisposeUow()
 {
     if (Options.IsTransactional == true)
     {
         _transactionStrategy.Dispose(IocResolver);
     }
     else
     {
         foreach (var activeDbContext in ActiveDbContexts.Values)
         {
             Release(activeDbContext);
         }
     }
     ActiveDbContexts.Clear();
 }
예제 #16
0
        protected override void DisposeUow()
        {
            if (Options.IsTransactional == true)
            {
                transactionStrategy.Dispose(IocResolver);
            }
            else
            {
                foreach (var context in GetAllActiveDbContexts())
                {
                    Release(context);
                }
            }

            ActiveDbContexts.Clear();
        }
예제 #17
0
        public virtual async Task <TDbContext> GetOrCreateDbContextAsync <TDbContext>(
            MultiTenancySides?multiTenancySide = null, string name = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide)
            {
                ["DbContextType"]         = typeof(TDbContext),
                ["DbContextConcreteType"] = concreteDbContextType
            };

            var connectionString = await ResolveConnectionStringAsync(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            if (name != null)
            {
                dbContextKey += "#" + name;
            }

            if (ActiveDbContexts.TryGetValue(dbContextKey, out var dbContext))
            {
                return((TDbContext)dbContext);
            }

            if (Options.IsTransactional == true)
            {
                dbContext = await _transactionStrategy
                            .CreateDbContextAsync <TDbContext>(connectionString, _dbContextResolver);
            }
            else
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);
            }

            if (dbContext is IShouldInitializeDcontext abpDbContext)
            {
                abpDbContext.Initialize(new AbpEfDbContextInitializationContext(this));
            }

            FilterExecuter.As <IEfUnitOfWorkFilterExecuter>().ApplyCurrentFilters(this, dbContext);

            ActiveDbContexts[dbContextKey] = dbContext;

            return((TDbContext)dbContext);
        }
예제 #18
0
        /// <summary>
        /// 获取或者创建数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文类型</typeparam>
        /// <param name="name">名称</param>
        /// <returns>数据库上下文对象</returns>
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(string name = null)
            where TDbContext : DbContext
        {
            var dbContextType = typeof(TDbContext);

            // TODO: 这里获取连接字符串,有待开发
            var nameOrConnectionString = "Default";

            var dbContextKey = $"{dbContextType.FullName}#{nameOrConnectionString}";

            if (string.IsNullOrWhiteSpace(name))
            {
                dbContextKey = $"{dbContextKey}#{name}";
            }

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(nameOrConnectionString, _dbContextResolver);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(nameOrConnectionString, null);
                }

                if (Options.Timeout.HasValue &&
                    dbContext.Database.IsRelational() &&
                    !dbContext.Database.GetCommandTimeout().HasValue)
                {
                    var commandTimeout = Convert.ToInt32(Options.Timeout.Value.TotalSeconds);

                    //dbContext.Database.SetCommandTimeout(Options.Timeout.Value.TotalSeconds.To<int>());
                    dbContext.Database.SetCommandTimeout(commandTimeout);
                }

                //TODO: Object materialize event
                //TODO: Apply current filters to this dbcontext

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #19
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(MultiTenancySides?multiTenancySide = null, string name = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide);

            connectionStringResolveArgs["DbContextType"]         = typeof(TDbContext);
            connectionStringResolveArgs["DbContextConcreteType"] = concreteDbContextType;
            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            if (name != null)
            {
                dbContextKey += "#" + name;
            }

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (Options.IsTransactional == true)
                {
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString, _dbContextResolver);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString, null);
                }

                if (Options.Timeout.HasValue &&
                    dbContext.Database.IsRelational() &&
                    !dbContext.Database.GetCommandTimeout().HasValue)
                {
                    dbContext.Database.SetCommandTimeout(Options.Timeout.Value.TotalSeconds.To <int>());
                }

                //TODO: Object materialize event
                //TODO: Apply current filters to this dbcontext

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #20
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>(
            MultiTenancySides?multiTenancySide = null, string name = null)
            where TDbContext : DbContext
        {
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionStringResolveArgs = new ConnectionStringResolveArgs(multiTenancySide)
            {
                ["DbContextType"]         = typeof(TDbContext),
                ["DbContextConcreteType"] = concreteDbContextType
            };

            var connectionString = ResolveConnectionString(connectionStringResolveArgs);

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            if (name != null)
            {
                dbContextKey += "#" + name;
            }

            if (ActiveDbContexts.TryGetValue(dbContextKey, out var dbContext))
            {
                return((TDbContext)dbContext);
            }

            if (Options.IsTransactional == true)
            {
                dbContext = _transactionStrategy
                            .CreateDbContext <TDbContext>(connectionString, _dbContextResolver);
            }
            else
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString, null);
            }

            if (dbContext is IShouldInitializeDcontext abpDbContext)
            {
                abpDbContext.Initialize(new AbpEfDbContextInitializationContext(this));
            }

            ActiveDbContexts[dbContextKey] = dbContext;

            return((TDbContext)dbContext);
        }
예제 #21
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : DbContext
        {
            var       connectionString = "Default";//这里简化直接写死  测试时用WebTest
            var       dbContextKey     = typeof(TDbContext).FullName + "#" + connectionString;
            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _efTransactionStrategy.CreateDbContex <TDbContext>(connectionString, IocResolve);
                if (!dbContext.Database.CommandTimeout.HasValue)
                {
                    dbContext.Database.CommandTimeout = 30;//默认30秒
                }
                ActiveDbContexts[dbContextKey] = dbContext;
            }
            return((TDbContext)dbContext);
        }
예제 #22
0
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : DbContext
        {
            var dbContextKey = typeof(TDbContext).FullName;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                dbContext = _dbContextResolver.Resolve <TDbContext>();
                ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += ObjectContext_ObjectMaterialized;

                foreach (var filter in Filters)
                {
                    if (filter.IsEnabled)
                    {
                        dbContext.EnableFilter(filter.FilterName);
                    }
                    else
                    {
                        dbContext.DisableFilter(filter.FilterName);
                    }

                    foreach (var filterParameter in filter.FilterParameters)
                    {
                        if (TypeHelper.IsFunc <object>(filterParameter.Value))
                        {
                            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, (Func <object>)filterParameter.Value);
                        }
                        else
                        {
                            dbContext.SetFilterScopedParameterValue(filter.FilterName, filterParameter.Key, filterParameter.Value);
                        }
                    }
                }

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #23
0
        /// <summary>
        /// uow完成后自动释放
        /// </summary>
        protected override void DisposeUow()
        {
            //DbContext.Dispose();

            if (null == Options)
            {
                return;
            }

            if (Options.IsTransactional == true)
            {
                foreach (var dbContext in DbContexts)
                {
                    IocResolver.Release(dbContext);
                }

                DbContexts.Clear();

                if (CurrentTransaction != null)
                {
                    CurrentTransaction.Dispose();
                    CurrentTransaction = null;
                }
            }
            else
            {
                foreach (var activeDbContext in ActiveDbContexts.Values.ToImmutableList())
                {
                    Release(activeDbContext);
                }
            }

            if (CurrentTransaction != null)
            {
                CurrentTransaction.Dispose();
                CurrentTransaction = null;
            }

            ActiveDbContexts.Clear();
        }
예제 #24
0
        /// <summary>
        /// 获取dbContext
        /// </summary>
        /// <typeparam name="TDbContext"></typeparam>
        /// <returns></returns>
        public virtual TDbContext GetOrCreateDbContext <TDbContext>()
            where TDbContext : DbContext
        {
            //1:找到dbContext
            var concreteDbContextType = _dbContextTypeMatcher.GetConcreteType(typeof(TDbContext));

            var connectionString = ResolveConnectionString();

            var dbContextKey = concreteDbContextType.FullName + "#" + connectionString;

            DbContext dbContext;

            if (!ActiveDbContexts.TryGetValue(dbContextKey, out dbContext))
            {
                if (DefaultOptions.IsTransactional == true)
                {
                    dbContext = _transactionStrategy.CreateDbContext <TDbContext>(connectionString, _dbContextResolver);
                }
                else
                {
                    dbContext = _dbContextResolver.Resolve <TDbContext>(connectionString);
                }

                if (DefaultOptions.Timeout.HasValue && !dbContext.Database.CommandTimeout.HasValue)
                {
                    dbContext.Database.CommandTimeout = DefaultOptions.Timeout.Value.TotalSeconds.To <int>();
                }

                ((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (sender, args) =>
                {
                    ObjectContext_ObjectMaterialized(dbContext, args);
                };

                FilterExecuter.As <IEfUnitOfWorkFilterExecuter>().ApplyCurrentFilters(this, dbContext);

                ActiveDbContexts[dbContextKey] = dbContext;
            }

            return((TDbContext)dbContext);
        }
예제 #25
0
 protected override void DisposeUnit()
 {
     _efTransactionStrategy.Dispose(IocResolve);
     ActiveDbContexts.Clear();
 }