/// <summary>
 /// 检查传入的数据库提供程序名称 <paramref name="providerName"/> 是否在当前应用程序运行环境中已经注册。
 /// </summary>
 /// <param name="providerName">数据库提供程序名称。</param>
 /// <exception cref="InvalidOperationException">如果传入的数据库提供程序名称 <paramref name="providerName"/> 在当前应用程序运行环境中尚未注册,则抛出该异常。</exception>
 internal static void CheckProviderNameRegisted(string providerName)
 {
     if (!DbProviderFactoryClasses.Any(item => item.InvariantName == providerName))
     {
         throw new InvalidOperationException(string.Format(Resources.UnregisteredProviderName, providerName));
     }
 }
        /// <summary>
        /// 获取该数据库提供程序的名称。
        /// </summary>
        /// <param name="factory">表示一个 <see cref="System.Data.Common.DbProviderFactory"/> 对象。</param>
        /// <returns>该数据库提供程序的名称,例如 <see cref="System.Data.SqlClient.SqlClientFactory"/> 对象返回 "System.Data.SqlClient"。</returns>
        public static string GetProviderName(this DbProviderFactory factory)
        {
            Type   factoryType  = factory.GetType();
            string providerName = null;

            if (!_factoryMappings.Value.TryGetValue(factoryType, out providerName))
            {
                DbProviderFactoryClass factoryClass = DbProviderFactoryClasses.FirstOrDefault(item => Type.GetType(item.AssemblyQualifiedName) == factoryType);
                providerName = factoryClass == null ? factoryType.Namespace : factoryClass.InvariantName;
                _factoryMappings.Value.Add(factoryType, providerName);
            }
            return(providerName);
        }