/// <summary>
 /// 在连接串映射完成后,执行映射后的动作。执行完后,恢复原有的映射
 /// </summary>
 /// <param name="srcConnectionName"></param>
 /// <param name="destConnectionName"></param>
 /// <param name="action"></param>
 public static void DoMappingAction(string srcConnectionName, string destConnectionName, Action action)
 {
     if (action != null)
     {
         using (DbConnectionMappingContext context = CreateMapping(srcConnectionName, destConnectionName))
         {
             action();
         }
     }
 }
        private static string GetMappedConnectionContectRecursively(string srcConnectionName, HashSet <DbConnectionMappingContext> elapsedContext)
        {
            DbConnectionMappingContext context = null;
            string result = srcConnectionName;

            if (DbConnectionMappingContextCache.Instance.TryGetValue(srcConnectionName, out context))
            {
                if (elapsedContext.Contains(context) == false)
                {
                    elapsedContext.Add(context);

                    result = GetMappedConnectionContectRecursively(context.destinationConnectionName, elapsedContext);
                }
            }

            return(result);
        }
        /// <summary>
        /// 释放对应关系
        /// </summary>
        public void Dispose()
        {
            DbConnectionMappingContext context = null;

            if (DbConnectionMappingContextCache.Instance.TryGetValue(this.sourceConnectionName, out context))
            {
                if (context.originalContext != null)
                {
                    DbConnectionMappingContextCache.Instance[this.sourceConnectionName] = context.originalContext;
                }
                else
                {
                    DbConnectionMappingContextCache.Instance.Remove(this.sourceConnectionName);
                }
            }

            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 创建连接名称的对应关系
        /// </summary>
        /// <param name="srcConnectionName"></param>
        /// <param name="destConnectionName"></param>
        /// <returns></returns>
        public static DbConnectionMappingContext CreateMapping(string srcConnectionName, string destConnectionName)
        {
            ExceptionHelper.CheckStringIsNullOrEmpty(srcConnectionName, "srcConnectionName");
            ExceptionHelper.CheckStringIsNullOrEmpty(destConnectionName, "destConnectionName");

            DbConnectionMappingContext localOriginalContext = null;

            DbConnectionMappingContextCache.Instance.TryGetValue(srcConnectionName, out localOriginalContext);

            DbConnectionMappingContext context = new DbConnectionMappingContext();

            context.sourceConnectionName      = srcConnectionName;
            context.destinationConnectionName = destConnectionName;
            context.originalContext           = localOriginalContext;

            DbConnectionMappingContextCache.Instance[context.sourceConnectionName] = context;

            return(context);
        }
示例#5
0
        /// <summary>
        /// 获取一个DbContext对象
        /// </summary>
        /// <param name="name">连接名称</param>
        /// <param name="autoClose">是否自动关闭</param>
        /// <returns>DbContext对象</returns>
        public static DbContext GetContext(string name, bool autoClose)
        {
            //得到映射后连接名称
            name = DbConnectionMappingContext.GetMappedConnectionName(name);

            DbProviderFactory factory = DbConnectionManager.GetDbProviderFactory(name);

            DbConnectionStringBuilder csb = factory.CreateConnectionStringBuilder();

            csb.ConnectionString = DbConnectionManager.GetConnectionString(name);

            bool enlist = true;

            if (csb.ContainsKey("enlist"))
            {
                enlist = (bool)csb["enlist"];
            }

            DbContext result = null;

            if (enlist)
            {
                result = new AutoEnlistDbContext(name, autoClose);
            }
            else
            {
                result = new NotEnlistDbContext(name, autoClose);
            }

            result.InitDbContext(name, autoClose);

            result._autoClose      = autoClose;
            result._commandTimeout = DbConnectionManager.GetCommandTimeout(name);

            return(result);
        }