/// <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); }
/// <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); }