2

网络配置

<connectionStrings configBuilders="CS_Environment">
   <add name="connectionA" connectionString="EnvVarA" providerName="System.Data.SqlClient"/>
   <add name="connectionB" connectionString="EnvVarB" providerName="System.Data.EntityClient"/>
</connectionStrings>

ConnectionStringSettings对象ProviderName将是一个空字符串,而不是"System.Data.SqlClient"or "System.Data.EntityClient"

和属性映射就好了NameConnectionString如果我configBuilders从标签中删除属性,将填充提供程序名称。当然,正确的环境变量将不再被获取,但关键是 configBuilder 打破了这一点。

这是用于连接字符串的配置生成器:

<add name="CS_Environment" mode="Greedy" prefix="ConnStr_" stripPrefix="true"
           type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
           Microsoft.Configuration.ConfigurationBuilders.Environment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
4

1 回答 1

1

当前接受的设置 providerName 顺序的答案似乎没有任何效果,至少在 v2.0 中没有。

在 v2.0 中,该问题是由ConnectionStringsSectionHandlerunder Greedymode 完全替换整个配置元素的错误引起的。

为什么会这样?

这与Greedy工作方式有关:它首先从您的后备存储中获取设置,并将每个找到的条目添加到配置中。由于该错误,connectionStrings它实际上确实会先删除然后添加新,因此会丢失providerName该过程中的所有额外属性(包括 )。

解决方法:使用Strict模式

使用Strict模式时,首先查找配置值,并使用覆盖值(如果存在)更新找到的每个条目。这意味着原始 conncetionString xml 节点保留了它的所有属性,包括prividerName.

修复:实现自定义处理程序

首先从默认继承开始ConnectionStringsSectionHandler,然后修复问题以重用现有的 connectionString(或仅应用适合您需要的 providerName)。

重要的一步是注册您的应用程序以使用您的处理程序而不是默认的处理程序

于 2020-08-02T07:36:41.237 回答