2010-02-08 37 views
4

我正在研究C#4.0,WPF 4.0,SQL 2008项目,并且我在家里和办公室工作。我只是根据其他问题中的建议,使用Visual SVN设置SubVersion。我遇到的问题是数据库的连接字符串对于每个位置都不相同。如何更改不同工作位置的连接字符串

在家里,我在我的开发系统上的数据库,在办公室的数据库是在我们的服务器上。两者都不会暴露在互联网上,所以我必须同时使用两者。有没有一种优雅的方式来自动选择正确的方法?

更新

我一直有这个问题,正在和我试图平衡与我的项目完成工作学习的版本控制。我一直在阅读颠覆书,并且对它所涵盖的内容都很满意。我的一个真正的问题是处理需要在开发环境正确之间变化的文件。我可以很容易地编写代码,但对我来说这似乎有点古怪。我看到的不仅仅是一些关于svn:exclude的古怪程度的文章,在我看来,在家工作会导致工作中的问题,反之亦然。

也许我只是不知道正确的答案,所以请指出正确的方向(我不需要你为我做)或投票最好的现有答案,我会继续我的研究。

谢谢SO

+0

这是一个经典问题,单靠版本控制工具无法解决。这真的是你开发过程的一部分。 – jeroenh 2010-02-13 07:24:42

回答

4

如果你真的想完全自动化这一点,你可以做这样的事情:

首先,保存设置针对源代码控制中的不同环境,而不是实际的配置文件。例如:

configfiles\app.config.mikeb_home 
configfiles\app.config.local 
configfiles\app.config.development 
configfiles\app.config.staging 
configfiles\app.config.production 

然后在你的构建配置,你可以添加一个步骤,以正确的配置文件复制到根的app.config。例如。根据“环境”参数(计算机名称,用户名,...)进行“预生成事件”(命令行脚本)。你可以通过在.csproj文件中添加一些msbuild命令来达到同样的效果。

但是,这一切真的值得吗? TortoiseSVN有一个名为'ignore-on-commit'的列表,它可以帮助您防止意外提交不应该提交的本地更改的文件(在提交对话框中,右键单击该文件=>移动到更改列表 - > ignore-on-commit)。如果你实际上需要改变.config文件中的其他内容,可能会有些恼人,但仍然可以。

+0

我认为这样做,我会知道我什么时候回家(在提交列表中使用忽略)出于某种原因,我无法在VS解决方案资源管理器中的文件上设置该属性,或者使用Windows资源管理器中的TortoiseSVN,但是我可以通过对文件进行更改(我添加了注释),然后在提交对话框中更改它 谢谢! – 2010-02-12 23:37:19

3

简单:不要把连接字符串放在代码中,从配置数据中读取它。然后,不要将该配置数据放入Subversion中。

在我现在正在使用的应用程序中,我们将连接字符串信息存储在Windows注册表的HKLM \ Software \ [OurProduct] \ Database中。

+0

一般来说,我不会推荐使用注册表(不一定是邪恶的)。对于像连接字符串这样的东西,app.config会很好地工作。 – Aaron 2010-02-08 20:38:52

+0

@Aaron:显然,注册表并不总是最好的选择。我只是把它作为一种选择。使用注册表的一个好处是,从非托管代码访问很容易,包括安装程序和其他实用程序。基本上,这取决于你想如何打包应用程序进行部署。 – 2010-02-09 00:04:18

3

难道你不能在家改变.config而不检查连接字符串的改变吗?

在代码中保存连接字符串信息是不好的做法(任何人都可以使用ildasm.exe并查看代码中的所有字符串)。

这种信息应该在配置中,您可以更好地控制。

此外,如果需要,.NET支持encryption of the connection string section

+0

为什么你认为连接字符串是在web.config?事实上,你为什么假定OP正在讨论一个Web应用?这个问题并没有说ASP.NET。 – 2010-02-08 19:55:52

+0

够公平的。丢弃了'web'前缀... – Oded 2010-02-08 20:00:55

+0

我想这就是我正在寻找的东西。该字符串当前存储在Settings.settings文件中。我只是从SubVersion中排除了这个文件,我会在今晚回家并做一次更新时看到它的工作原理。这是我使用任何形式的源代码控制的第一天,所以我仍然感受到了工作流程。 – 2010-02-08 20:58:10

0

在源代码控制中,使用app.config中用于最常用连接字符串(可能是工作)的连接字符串。

在家中,劫持(或检出)选择要使用哪个连接字符串的文件,并对其进行编辑以使用您的主连接字符串。

+1

为什么你认为连接字符串是在web.config?事实上,你为什么假定OP正在讨论一个Web应用?这个问题并没有说ASP.NET。 – 2010-02-08 19:55:31

+1

@Daniel:在app.config和web.config之间没有足够的区别,因为它确实是OP在尝试更改Web应用程序还是桌面应用程序。 – Brian 2010-02-08 20:03:24

+0

@丹尼尔:你说得对。事实上,我重新阅读了这个问题,并意识到他问的是一个WPF应用程序,这绝对不是ASP.NET。我已更新我的帖子以引用'app.config'。感谢您指出了这一点。 – Aaron 2010-02-08 20:33:28

0

您可以使用设置来定义多个连接字符串。只需从Solution Explorer-> project-> Properties中双击Settings.settings。那么您将看到包含设置类型的组合框。选择ConnectionString然后输入connstr。

那么你就可以得到connstr与下面的代码

using System.Configuration; 

using test.Properties; 

namespace test{ 
public partial class mainForm : Form{ 

    public mainForm() 

    { 
     InitializeComponent();    

    } 

    private void mainForm_Load(object sender, EventArgs e) 
    { 
     string connectionStr = ConfigurationManager.ConnectionStrings[this_index_is_up_to your_algorithm].ToString(); 
    } 
} 

}

0

.NET有一种使用file属性覆盖另一个配置文件中的设置的方法。我们通常做这样的事情:

的web.config

<configuration> 
    <appSettings file="web.custom.config"> 
     <!-- your default settings here --> 
    </appSettings> 
</configuration> 

web.custom.config

<appSettings> 
    <!-- override stuff from root web.config here here --> 
</appSettings> 

按照惯例,我们建立了我们的源代码控制系统[SVN]忽略任何custom.config文件。这使我们能够签入核心的默认设置,同时仍然允许每个开发人员管理特定于环境的设置。

注意:这只适用于<appSettings>键。如果您要在<connectionStrings>键中存储连接字符串,请考虑将这些设置移至appSettings。

http://msdn.microsoft.com/en-us/library/ms228154.aspx

1

我认为理想的解决方案是使用类似的东西在Visual Studio 2010中添加不幸的是,据我可以告诉这些只适用于web.config文件中的web.config transforms