【问题标题】:Two different connection strings for web.config in GitGit 中 web.config 的两个不同连接字符串
【发布时间】:2014-06-27 19:50:04
【问题描述】:

我是 Git 的新手,我目前正在将 SVN 中的项目迁移到 Git。它目前的工作方式是在服务器上有一个 dev 目录,在服务器上有一个 production 目录。开发和生产各有一个单独的数据库,因此在各自的 web.config 中有不同的连接字符串。我将使用 gitflow 工作流,所以当更改准备好投入生产时,我会将 dev 合并到 master 中,所以我需要让 dev 分支上的 web.config 有一个连接字符串并有一个单独的连接生产分支上的字符串。有什么合乎逻辑的方法吗?

【问题讨论】:

    标签: asp.net git web-config


    【解决方案1】:

    在 asp.net 中,您可能需要查看 web.config transformation。您的项目中可能已经有一个 web.release.config 和一个 web.debug.config 。它们可用于根据您用于构建应用程序的构建配置(构建、调试等)来切换连接字符串。

    我遇到的另一个想法是将您的连接字符串包含在一个单独的文件中,例如:

    <configuration>  
        <connectionStrings configSource="connectionStrings.config" />
    </configuration>
    

    这将导致 .NET 从 connectionStrings.config 文件加载连接字符串。然后在版本控制中忽略该文件,并将开发版本分发到本地开发环境中,暂存版本放置在暂存服务器上,然后生产版本留在生产中。

    肯定有比这些更多的解决方案。但在较小的 gitflow 类型环境中,我对这两个选项的运气都不错。

    【讨论】:

    • 我将尝试使用您建议的单独文件。看来这应该可以解决问题。谢谢!
    • 这已经很老了,但是“开发版本分布在本地开发环境中”是什么意思?您如何/将如何分发文件?我真的很想使用一个单独的文件,以便不同的开发人员在他们的开发环境中可以有不同的连接字符串,但同时我希望他们在新开发人员签出项目时默认拥有该文件。两个都可以吗?
    【解决方案2】:

    您应该使用Web.config Transformations 进行基于部署的配置。它们可以在分支之间移动,因为它们在所有分支上都应该相同。

    但是对于本地开发,您应该使用Web.configGit Attributes

    只需在项目的根目录(.git/ 文件夹所在的位置)创建一个 .gitattributes 文件,然后在文件中放入以下行:

    Web.config merge=ours
    

    每次将分支与更新的 Web.config 文件合并时,它都会保留您当前的更改。

    【讨论】:

    • +1 for .gitAttributes,但“它们可以在分支之间移动,因为它们在所有分支上都应该相同。”并非所有设置都是如此。我经常在功能分支和“补丁”/修补程序分支之间切换,这需要完全不同的数据库。
    【解决方案3】:

    这是我如何做的一个实例......

    编辑我的 Web.Config 文件
    注意:名称:DefaultConnection、LocalConnection、livebsource、localdbsource、localMachineName

     <connectionStrings>
     <!--Live-->
     <add name="DefaultConnection" connectionString="Data Source=livedbsource;Initial Catalog=livedbname;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
    <!--Dev-->
    <add name="LocalConnection" connectionString="Data Source=localdbsource;Initial Catalog=localdbname;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    对于 ApplicationDbContext

    static string ServerName = System.Net.Dns.GetHostName();
    //setting what connection string to use - tenary operator
    static string ConnectionStringID = 
            (ServerName == "localMachineName") ? "LocalConnection" : "DefaultConnection";
    public ApplicationDbContext(): base(ConnectionStringID, throwIfV1Schema: false)
    {
    }
    

    在 Windows 7 及更高版本上,您可以通过按 Windows 徽标并搜索系统信息来获取 localMachineName,然后查找“系统名称”

    这是我在 Visual Studio 2017 中的一个实时项目中制作的 YouTube 视频,它成功了。

    https://youtu.be/oKg6ewKhkYs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      相关资源
      最近更新 更多