C# 在运行时更改自定义连接字符串

本文关键字:自定义 连接 字符串 运行时 | 更新日期: 2023-09-27 18:33:37

EF上的位新。我正在创建用户从计算机选择数据库的应用程序。现在我想更改连接字符串以匹配数据库的位置,例如:这是指向磁盘上某处数据库位置的当前连接字符串(C:''用户''学生''文档''TestData.md(:

add name="test" connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDB)'v11.0;attachdbfilename="C:'Users'student'Documents'TestData.mdf";integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />

现在,当用户从磁盘中选择新数据库时,连接刺痛需要更改为新数据库所在的位置(C:''Users''student''Desktop''NewSelectedDatabase.mdf(:

add name="test" connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDB)'v11.0;attachdbfilename="C:'Users'student'Desktop'NewSelectedDatabase.mdf";integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />

现在我已经创建了FileDialog,以便用户可以选择数据库并获取其地址。 我还更改了我的 EDMAX 以接收自定义连接字符串:

    public partial class Tester : DbContext
{
    public Tester()
        : base("name=Test")
    {
    }
    public Tester(string customcs)
        : base(customcs)
    {
    }

现在我的问题是我应该将什么作为自定义连接字符串传递给构造函数? 我希望你理解我,因为我的英语真的很差,解释事情

C# 在运行时更改自定义连接字符串

启动 EF 设计器后,属性窗口上会显示连接字符串设置。 根据需要设置所有内容后,将该设置清除为无。 它重写生成的代码以接受在实例化时传入的连接字符串。

var mything= new dbcontext (connstring)

另一种选择是创建一个新的类 (.cs( 文件,为其提供与 Tester EF 上下文所属的相同命名空间,并将其粘贴到其中:

public partial class Tester : DbContext {
    public Tester(string _connectionString) : base(ConnectionString(_connectionString)) {
        this.Configuration.ProxyCreationEnabled = false;
        this.Configuration.AutoDetectChangesEnabled = false;
    }
    private static string ConnectionString(string _connectionString) {
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.ProviderConnectionString = _connectionString;
        entityBuilder.Metadata = "res://*/Models.Tester.csdl|res://*/Models.Tester.ssdl|res://*/Models.Tester.msl";
        entityBuilder.Provider = "System.Data.SqlClient";
        return entityBuilder.ToString();
    }   
}

请注意,它是一个分部类(就像 Tester 自动生成的类一样(——因此您将添加到 EF 创建的自动生成的类中(再次,请确保它们位于相同的命名空间中,因此它确实是对分部类的添加,而不仅仅是您创建自己的小类(。

这样,你将添加一个新的构造实例化(即传递连接字符串(,该实例化被修改为正确的实体连接字符串生成器(通过专用静态ConnectionString方法(。

var myThing = new Tester(ConfigurationManager.ConnectionStrings["db_DBName"].ToString());

我在 web.config 中有一行用于连接:

<add name="db_DBName" connectionString="Data Source=DBSERVER;initial Catalog=DBNAME;" providerName="System.Data.SqlClient" />

构建目标定义了它的转换,我只是一直将相同的字符串传递到代码中。