【问题标题】:C# change custom connection string at runtimeC# 在运行时更改自定义连接字符串
【发布时间】:2014-12-09 12:26:20
【问题描述】:

EF 有点新。我正在创建用户从计算机中选择数据库的应用程序。现在我想更改连接字符串以匹配数据库的位置,例如:这是指向磁盘上某处的数据库位置的当前连接字符串(C:\Users\student\Documents\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" />

现在我已经创建了文件对话框,因此用户可以选择数据库并获取其地址。我还将我的 edmax 更改为接收自定义连接字符串:

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

    public Tester(string customcs)
        : base(customcs)
    {

    }

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

【问题讨论】:

  • 检查this链接。
  • 找到解决方案:我将旧连接字符串复制粘贴到字符串,然后将 attachdbfilename 更改为 openfile 对话框位置,然后传递给构造函数,谢谢:D
  • @user3764527 -- 我在下面添加了我的答案,它提供了另一种更动态的方式(使用部分类)。

标签: c# winforms entity-framework-5 connection-string


【解决方案1】:

启动 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" />

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

【讨论】:

  • Nice :D , var mything= new dbcontext (connstring) 非常好,但这给了我更多选择。这就是首先使用代码制作模型的方式吗?
  • 也许,也许?我还没有解决 Code-First 方法,每次我完成它时,我都会在现有数据库(DB First,设计器)上搭建脚手架。我记得当我需要以 Oracle 数据库为目标并使用他们拥有的托管驱动程序时,我想到了第二个选项。
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多