以编程方式为EntityFramework设置ConnectionString。

时间:2017-03-21 06:16:19

标签: c# wpf entity-framework-5

我们有一个数据库(MySQL)说DemoDB。我们使用db有不同的帐户。因此创建了每个帐户的一个数据库,例如Account1DB,Account2DB。 Tables存储过程和函数都是相同的。我们需要开发Web API并提供一些插入和更新数据的服务。用户通过指定AccountName(例如,来自WPF应用程序,其中字段是UserName,Password和Account ComboBox)登录。我们需要将连接字符串的初始目录设置为用户登录的帐户(实际上,我们需要在登录用户之前设置初始目录,因为我们需要根据帐户检查其凭据)。

示例WPF屏幕:

用户名:A

密码:秘密

帐户:帐户1

当用户点击登录时,这就是我想要做的事情:

1: - >将连接字符串中的初始目录设置为Account1DB

2: - >然后,用户执行的所有数据库操作(包括身份验证)都应该在Account1DB Schema

我想采用Database First方法。怎么做到这个?

先谢谢,

Abhilash D K

2 个答案:

答案 0 :(得分:1)

您可以更改从DbContext派生的类,将connectionString作为参数传递给基本DbContext构造函数。

public partial class MyContext : DbContext
{
    public MyContext() : base("name=MyDbName")
    {
    }

    public MyContext(string connectionString) : base(connectionString)
    {
    }

    // Class members
}

然后你可以使用类似连接字符串工厂的东西:

public class ConnectionStringFactory
{
    public string GetConnectionString(string initialCatalog)
    {
        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder.InitialCatalog = initialCatalog;

        // Set another connection parameters

        return builder.ToString();
    }
}

现在,您可以使用单独的上下文,检查凭据并执行所有数据库操作,如下所示:

    ConnectionStringFactory factory = new ConnectionStringFactory();
    string connectionString = factory.GetConnectionString("Account1DB");
    MyContext context = new MyContext(connectionString);

答案 1 :(得分:0)

您可以改变当然但不提供优惠。它可以在没有正确消息的情况下在运行时抛出异常,我就像这种情况一样挑战。 你这样改变了;

DbContext source; //i assumed you created on

 var entitysb= new EntityConnectionStringBuilder
                (System.Configuration.ConfigurationManager
                    .ConnectionStrings["EntityConnection"].ConnectionString);

var sqlsb = new SqlConnectionStringBuilder
                (entitysb.ProviderConnectionString);
source.Database.Connection.ConnectionString 
                = sqlsb.ConnectionString;