【问题标题】:Switchable connection strings via code at run time在运行时通过代码切换连接字符串
【发布时间】:2017-12-29 16:57:46
【问题描述】:

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

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

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

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

有人做过吗?有什么技巧可以轻松做到这一点吗?

【问题讨论】:

  • 切换是指在启动时或在应用程序生命周期内只切换一次?
  • @Evk:运行时间,我的意思是在应用程序运行时。它可能在应用程序的一个实例期间发生任意次数。
  • 所有上下文实例都使用相同的连接字符串?
  • @Evk:是的。切换完成后,所有对数据库的访问都将使用新的连接字符串。
  • 好吧,那么在这种情况下,我确实只使用静态 ConnectionString 属性,您可以从默认上下文构造函数 (public MyContext():base(ConnectionString) {}) 中使用该属性。以上评论可能是针对@JohnH。

标签: c# wpf entity-framework dbcontext


【解决方案1】:

所以我想出的最好办法是在我的实体类中添加一个静态的ConnectionString 属性。然后修改构造函数,将这个属性传递给基类。

一个问题是,当模型更新时,对实体类的任何更改都会被 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 脚本时,它会立即重新生成代码。

【讨论】:

  • T4 脚本如何在运行时实际更改连接字符串?它是由其他进程或服务生成的吗?
  • @ryanwebjackson:默认构造函数传递一个字符串,指示应从配置文件中读取连接字符串。我的更改导致它通过静态ConnectionString 属性。我的问题的全部要点是我希望能够从代码中更改此连接字符串,现在我可以通过设置该属性的值。然后,当我创建 DbContext 的实例时,它将使用该值。
  • 哦,我明白了 - 这是您修改以满足您的需要的现有代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2017-11-17
  • 2021-07-29
相关资源
最近更新 更多