private static string AlterConnectionStringPropertyValue(this string connectionString, string providerName, Func <string, string> alteractionFunction)
        {
            Argument.IsNotNullOrEmpty(() => connectionString);
            Argument.IsNotNullOrEmpty(() => providerName);
            Argument.IsNotNull(() => alteractionFunction);

            var provider           = DbProvider.GetRegisteredProviders()[providerName];
            var dbConnectionString = provider.CreateConnectionString(connectionString);

            if (dbConnectionString is null)
            {
                return(connectionString);
            }

            var connectionStringBuilder = dbConnectionString.ConnectionStringBuilder;
            var sensitiveProperties     = dbConnectionString.Properties.Where(x => x.Value.IsSensitive);

            foreach (var sensitiveProperty in sensitiveProperties)
            {
                var value = connectionStringBuilder[sensitiveProperty.Key].ToString();
                if (!string.IsNullOrWhiteSpace(value))
                {
                    connectionStringBuilder[sensitiveProperty.Key] = alteractionFunction(value);
                }
            }

            return(connectionStringBuilder.ConnectionString);
        }
        public static string GetConnectionStringProperty(this string connectionString, string providerName, string propertyName)
        {
            Argument.IsNotNullOrEmpty(() => connectionString);
            Argument.IsNotNullOrEmpty(() => providerName);

            var provider           = DbProvider.GetRegisteredProviders()[providerName];
            var dbConnectionString = provider.CreateConnectionString(connectionString);

            if (dbConnectionString is null)
            {
                return(connectionString);
            }

            if (dbConnectionString.Properties.TryGetValue(propertyName, out var dataSourceProperty))
            {
                return(dataSourceProperty.Value?.ToString() ?? string.Empty);
            }

            return(null);
        }
        private static DbProvider GetProviderByConnectionType(Type connectionType)
        {
            Argument.IsNotNull(() => connectionType);

            if (ConnectionTypeToProvider.TryGetValue(connectionType, out var dbProvider))
            {
                return(dbProvider);
            }

            var dbProviders = DbProvider.GetRegisteredProviders();

            foreach (var currentProvider in dbProviders.Values)
            {
                if (currentProvider.ConnectionType == connectionType)
                {
                    ConnectionTypeToProvider[connectionType] = currentProvider;
                    return(currentProvider);
                }
            }

            return(null);
        }