C# DbContext 连接类型和服务器

C# DbContext Connection Type and Server

我在一台连接到同一台笔记本电脑上的 SQL 服务器的笔记本电脑上开发了一个 WinForm 应用程序。

我有一台新笔记本电脑,并为 SQL 服务器创建了 docker 设置。我希望更改代码库以使用新的 SQL 服务器。

新服务器使用 SQL 服务器身份验证,在新笔记本电脑上使用用户名和密码。旧笔记本电脑在 windows 安装设置上使用 windows 身份验证。我已将整个数据库的副本迁移到 docker 化的 sql 服务器实例中。

应用程序在应用程序配置中有连接设置,自然这是为了 windows 身份验证。

我的 app.config 已提交到我的 github 存储库。我不想将 sql user/password 存储在 app.settings 中,而是想从我在机器上设置的环境变量中获取这些。

我还想知道如何更改 app.config 中连接字符串的格式,以便它与 sql 服务器身份验证一起使用。

或者现在我已经解释了我正在尝试做的事情,也许有更好的方法?

我当前的连接字符串是

<connectionStrings>
    <add name="Blah.Properties.Settings.BlahConnectionString" 
        connectionString="Data Source=W.....R....;
        Initial Catalog=Blah;
        Integrated Security=True;
        Connect Timeout=30;Encrypt=False;
        TrustServerCertificate=False" 
        providerName="System.Data.SqlClient"/>
</connectionStrings>


[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Blah")]
public partial class BlahDBDataContext : System.Data.Linq.DataContext

我搜索了 'AddDbContextFactory' 和 'GetConnectionString'

的所有代码
    public BlahDBDataContext() :
 base(global::Blah.Properties.Settings.Default.BlahConnectionString, mappingSource) 
{ 
    OnCreated(); 
}


[global::System.Configuration.DefaultSettingValueAttribute("Data Source=PCNAME;Initial Catalog=Blah;Integrated Security=True" + ";Connect Timeout=30;Encrypt=False;TrustServerCertificate=False")] 
public string BlahConnectionString 
{ 
    get { return ((string)(this["BlahConnectionString"])); 
}

据我所知,数据库上下文 class 是生成的代码继承 System.Data.Linq.DataContext,如我的应用程序中的这段代码所示。

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Blah")]
public partial class BlahDBDataContext : System.Data.Linq.DataContext
{

BlahDBDataContext class 提供了许多构造函数。请自行查看更完整的列表。

出于我的目的,我需要的构造函数是

public BlahDBDataContext(System.Data.IDbConnection connection) : 
    base(connection, mappingSource)
{
    OnCreated();
}

这需要为 hold/manage 连接详细信息构造一个 System.Data.IDbConnection 对象。

因此,在我的例子中,我需要做的就是构造连接字符串,例如。

string userName = EnvironmentVariables.GetValue("BLAH_USERNAME");
string password = EnvironmentVariables.GetValue("BLAH_PASSWORD");
string server = EnvironmentVariables.GetValue("BLAH_SERVER");
string database = EnvironmentVariables.GetValue("BLAH_DATABASE");
connectionString = $@"Data Source={server};Initial Catalog={database};Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;User ID={userName};Password={password};";

然后所需要的就是

新的 BlahDBDataContext( 新的 SqlConnection( Program.GetDatabaseConnectionString()))

其中 Program.GetDatabaseConnectionString() 是。

    public static string GetDatabaseConnectionString()
    {
        if (connectionString is null)
        {
            string userName = EnvironmentVariables.GetValue("BLAH_USERNAME");
            string password = EnvironmentVariables.GetValue("BLAH_PASSWORD");
            string server = EnvironmentVariables.GetValue("BLAH_SERVER");
            string database = EnvironmentVariables.GetValue("BLAH_DATABASE");
            connectionString = $@"Data Source={server};Initial Catalog={database};Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;User ID={userName};Password={password};";
        }
        return connectionString;
    }

从 SOLID 原则和干净编码的角度来看,这需要重构,现在我有工作代码将被清理。