代码之家  ›  专栏  ›  技术社区  ›  Jonathan Wood

运行时通过代码切换连接字符串

  •  1
  • Jonathan Wood  · 技术社区  · 6 年前

    我有一个WPF应用程序。它有许多访问数据库的块。连接字符串由my中的设置确定 应用程序。配置 文件

    using (var dbContext = new MyEntities())
    {
        // ...
    }
    

    但现在我需要在运行时在不同数据库之间切换的能力。我已经更新了代码来管理数据库列表,以及每个数据库的连接字符串。

    我的问题是,有没有办法让现有代码使用我的代码所指示的连接字符串,而不必更改现有代码?例如,也许我可以在entities类中创建一个静态连接字符串属性,然后修改该类以在每次连接到数据库时使用该属性。

    有人这样做过吗?以无痛的方式做这件事有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jonathan Wood    6 年前

    所以我想到的最好办法是添加一个静态 ConnectionString 属性设置为my entities类。然后修改构造函数以将此属性传递给基类。

    一个问题是,当模型更新时,对entities类的任何更改都会被T4脚本覆盖。您可以创建一个分部类并定义自己的构造函数,但如果该构造函数没有参数,那么它将与现有构造函数冲突。

    我的解决方案是直接编辑现有的T4脚本,如下所示。

    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
    {
        // Original code
        //public <#=code.Escape(container)#>()
        //    : base("name=<#=container.Name#>")
        //{
    
        // Modified code
        public static string ConnectionString { get; set; }
    
        public <#=code.Escape(container)#>()
            : base(ConnectionString)
        {
    
        // End of modified code
    
    <#
    if (!loader.IsLazyLoadingEnabled(container))
    {
    #>
            this.Configuration.LazyLoadingEnabled = false;
    <#
    }
    

    保存T4脚本时,它将立即重新生成代码。