我有一个包含多个项目的解决方案,例如类库,网站,服务等。
类库和服务等项目具有到同一数据库的dbml连接。这意味着项目具有连接字符串,例如:
MySolution.ClassLibrary.DatabaseA
MySolution.ClassLibrary.DatabaseB
MySolution.ClassLibrary.DatabaseC
MySolution.Service.DatabaseA
MySolution.Service.DatabaseD
这有点乱,因为我复制了连接字符串。出于集成目的,我还添加了另一个共享组件类库 - 它也可以访问相同的数据库(不同的表)。所以我现在在某些地方有3个相同连接字符串的实例!
如上所述,这不仅是凌乱的,而且还会让它对bug产生开放,因为如果网站或服务中缺少连接字符串,它最终会尝试指向我们的开发数据库(因为它默认为设置来自班级图书馆。)
我真正想要的只是拥有一个非连接字符串的非命名空间版本,并在任何地方共享它,例如。
MySolution.ConnectionStrings.DatabaseA
MySolution.ConnectionStrings.DatabaseB
MySolution.ConnectionStrings.DatabaseC
MySolution.ConnectionStrings.DatabaseD
然后我会将每个dbml指向这些连接字符串并完成工作!
问题是VS2012在更改dbml的(右键单击>属性)中的连接字符串时非常麻烦。它在app或web.configs和Settings.settings之间混淆 - 通常在选择DatabaseConnectingStringA时,它会创建一个名为DatabaseConnectionStringA1的新的,这非常令人沮丧!当你通过项目设置添加它时,它也总是将它自己的命名空间添加到连接字符串 - 这是dbml所必需的。
有没有人有诀窍或方法让VS做到这一点?
答案 0 :(得分:0)
最后我确实找到了解决方案。它并不完美,但它将我的连接字符串从7或8(在某些地方)减少到4,我可以在所有项目之间复制和粘贴各种调试/发布/暂存构建。
基本上,对于每个DBML,我添加了一个带有构造函数的分部类,该构造函数专门使用我的连接字符串:
partial class MyDataContext
{
public MyDataContext() : base(ConfigurationManager.ConnectionStrings["Master.DatabaseA"].ConnectionString)
{
OnCreated();
}
}
然后,在加载我可以看到所有表的DBML文件后,我右键单击并在后台选择属性并将连接更改为None。
这意味着Web或App Config将查找仅仅是" Master.DatabaseA"的连接字符串。没有引用项目名称空间。
然后我还清除了其他项目中的旧连接字符串,现在它们都干净利落。唯一的问题是,每次添加新表或存储过程时,我都需要将连接设置回None。该项目不会在这种情况下建立,因此不会意外地错过。