connectionstrings 的 name 属性必须全局唯一,重复会导致静默覆盖、取值失败或 nullreferenceexception;需校验重名、避免非法字符、统一大小写、使用常量管理,并注意 configsource 和 transform 的影响。

connectionStrings 的 name 属性必须全局唯一
Web.config 里多个 <add></add> 节点如果用了重复的 name,运行时不会报错,但后续通过 ConfigurationManager.ConnectionStrings["xxx"] 只能取到最后一个同名项——前面的被静默覆盖了。
- 检查所有
<add name="xxx"></add>是否真的不重名,包括被configSource拆分出去的外部文件 - 开发阶段建议在
Global.asax Application_Start里加一段校验逻辑,遍历ConfigurationManager.ConnectionStrings并用.Cast<connectionstringsettings>()</connectionstringsettings>去查重名 - IIS 部署后,
web.config可能被自动合并(比如从 machine.config 继承),实际生效的 name 列表可能比你写的多
name 值不能含空格或特殊字符,但大小写敏感
name 是 .NET 内部用作字典键的字符串,只支持字母、数字、下划线、短横线;空格、点号、中文、括号都会导致 ConfigurationErrorsException,错误信息通常是 Unrecognized attribute 'name' 或更隐蔽的 Object reference not set(因为取不到连接字符串对象)。
- 合法示例:
name="ProdDb"、name="legacy_api_v2" - 非法示例:
name="prod db"、name="My.DB"、name="主库" - 注意:
name="MyDB"和name="mydb"在 .NET 中是两个不同键,别在代码里大小写写错
代码里读取时 name 必须和 config 完全一致,包括拼写和大小写
很多人改了 config 的 name 却忘了同步改 C# 里的字符串字面量,结果 ConfigurationManager.ConnectionStrings["AppDb"] 返回 null,接着调 .ConnectionString 就抛 NullReferenceException。
- 推荐把 name 提成常量:
public const string DbConnName = "AppDb";,两边共用 - 调试时直接在 Watch 窗口输
ConfigurationManager.ConnectionStrings.Keys,看实际加载了哪些 name - 发布前用 PowerShell 快速检查:
[xml](Get-Content web.config).configuration.connectionStrings.add.name
web.config 被转换时(如 Web.config Transform),name 可能被意外覆盖或删掉
Visual Studio 的 Web.Release.config transform 如果写了 xdt:Transform="SetAttributes(name)",但没配对的 xdt:Locator,就可能把所有 <add></add> 的 name 全改成同一个值。
- 典型错误写法:
<add name="ReleaseDb" ... xdt:transform="SetAttributes(name)"></add>—— 缺少xdt:Locator="Match(name)" - 安全写法:先定位再改,例如
<add name="DevDb" ... xdt:transform="SetAttributes(name)" xdt:locator="Match(name)"></add> - transform 后生成的最终 web.config 不会高亮提示 name 冲突,得手动打开看或用 diff 工具比对
配置项名字看着小,但它是连接字符串在内存里唯一的身份证。拼错一个字母、漏掉一个下划线、或者 transform 时 locator 写漏了,后面查半天 null 引用都未必想到这儿。










