我有一个包含5个应用程序的系统。每个应用程序都通过DAL库访问数据库。在DAL中我有一个带有以下条目的app.config:
<connectionStrings>
<add name="DataAccessLayer.Properties.Settings.ConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=c:\users\something\something\MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>
使用attachDbFilename的完整路径可以正常工作。但我不高兴:
我已将app.config文件复制到使用该数据库的每个应用程序中。这样做的最佳方式 - 将DAL app.config复制为其他项目中的链接?
我不想要一个完整的路径,当涉及部署时,aint会起作用。 app.config中的相对路径似乎不起作用。理想情况下,我希望能够将DAL从源代码控制中提取到任何计算机上,而不必担心每次都更改连接字符串。这个:http://blogs.msdn.com/b/smartclientdata/archive/2005/08/26/456886.aspx谈到| DataDirectory |出于部署目的但这在调试中对我不起作用(除非我使用它错误,请参阅3)
这可能更好作为一个单独的问题,但它与2有关。 - 是否有一种“好”的方式来安排多个项目进行调试?我创建了一个Bin目录,并在每个项目设置中将dll / exe复制到此bin目录。我在这里也有一个数据库的副本(我在app.config中没有尝试过任何路径但是也没有工作,也没有| DataDirectory |)。同样令人难以置信的是,相对路径在Debug \ Working Directory设置中也不起作用,所以看起来这是每次将代码签出到新机器时都需要更改的地方吗?
为战争与和平道歉,并提前感谢任何想法。
答案 0 :(得分:4)
两个答案 - 但不是真正完整的解决方案:
1)我已将app.config文件复制到使用该数据库的每个应用程序中。最好的方法 - 在其他项目中将DAL app.config复制为链接?
您可以将连接字符串外部化为自己的配置,例如:
<connectionStrings configSource="connectionStrings.config" />
然后在该新文件中包含这些连接字符串:
<connectionStrings>
<add name="DataAccessLayer.Properties.Settings.ConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=c:\users\something\something\MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>
这样,您可以拥有自定义app.config,但可以分享共性。
2)当涉及到无法正常工作的部署时,我不想要一个完整的路径。 app.config中的相对路径似乎不起作用。
不幸的是,你唯一能做的就是使用|DataDirectory|
占位符,它是ASP.NET应用程序中App_Data
文件夹的占位符。
<add name="DataAccessLayer.Properties.Settings.ConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|MyDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
唯一的其他解决方案是使用服务器并连接到服务器 - 而不是让文件动态安装和附加。
答案 1 :(得分:4)
使用来自多个进程的连接字符串AttachDbFilename功能引用相同的 MDF是非常糟糕的主意。共享自动缓存数据库可以解决所有类型的复杂安全/所有权数据库启动问题。并且指定User Instance=True
就像在火焰上注入气体一样,因为每个用户实例都是每个用户所以如果您的应用程序配置为在不同的apppool凭据下运行,或者突然被更改为模拟,一切都破裂了。
只需将MDF作为普通数据库附加到您的SQL实例并使用它,并使用一个正常的连接字符串:Data Source=.\SQLEXPRESS;Initial Catalog=<dbname>; Integrated Security=True
。