在运行时更新EF5模型ConnectionString

时间:2014-01-04 13:39:43

标签: c# sql-server entity-framework

我在本地服务器上使用SQL Db winforms app。我使用Database_First添加了EF5。 问题是: 如何使用“OpenFileDialog”在“运行时”中更改EF5模型的连接字符串?

我想为应用程序提供一个“功能”,让客户端指定应用程序数据库所在的数据库服务器。

2 个答案:

答案 0 :(得分:2)

有两个问题需要考虑。 第一个DbContext具有构造函数,该构造函数接受用户定义的连接字符串,但此构造函数不会在生成的上下文代码中公开,因此您必须将其添加到生成的代码之外的部分文件中。 然后,Entity Framework连接字符串本身与典型的SqlClient连接字符串不同,因此您必须使用EntityConnectionStringBuilder来构建适当的连接字符串。

例如,请考虑以下示例代码:

public partial class MyContext: DbContext
{
    public MyContext(string efConnectionString):base(efConnectionString)
    {

    }

    public static MyContext CreateContextFromAdoCS(string adoConnectionString)
    {
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

        //Set the provider name.
        entityBuilder.Provider = "System.Data.SqlClient";

        // Set the provider-specific connection string.
        entityBuilder.ProviderConnectionString = adoConnectionString;

        // Set the Metadata location.
        entityBuilder.Metadata = @"res://*/MyModel.csdl|
                        res://*/MyModel.ssdl|
                        res://*/MyModel.msl";
        var efCs = entityBuilder.ToString();

        return new MyContext(efCs);
    }
}

如果您有现有的SqlClient连接字符串,则可以使用工厂方法创建上下文的实例。

在这里Display a ConnectionString dialog,您可以看到如何打开标准对话框来构建SqlClient连接字符串。

答案 1 :(得分:0)

让它在App.config

<add name="ConnectionStringNew" connectionString="Data Source=ServerName;user id=sa;Password=sasa;initial catalog=[DataBase]" />

让Combobox让用户选择数据库。

使用以下编码对组合框进行处理。

SqlConnection con1 = new SqlConnection (ConfigurationManager.ConnectionStrings["ConnectionStringNew"].ConnectionString);

SqlCommand comm = new SqlCommand("SELECT ROW_NUMBER() OVER(ORDER BY NAME) AS ID,NAME FROM SYS.SYSDATABASES WHERE DBID > 4 ORDER BY NAME", con);

SqlDataAdapter da = new SqlDataAdapter(comm);                
da.Fill(dtblDataBase);

cmbDataBase.DataSource = dtblDataBase;  
cmbDataBase.ValueMember = "ID";  
cmbDataBase.DisplayMember = "NAME";

替换数据库名称如下所示。

DataBaseName = Convert.ToString(con1.ConnectionString);
CommonVariables.strDataBaseName = DataBaseName.Replace("[DataBase]",      cmbDataBase.Text.Trim());
CommonVariables.strCompanyName = cmbDataBase.Text.Trim();

我刚给出了一个编码样本..根据需要自定义。