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