以编程方式为 EntityFramework 设置 ConnectionString。
Set ConnectionString for EntityFramework Programmatically.
我们有一个数据库 (MySQL),比如 DemoDB。我们有不同的帐户使用数据库。因此,为每个帐户创建一个数据库,比如 Account1DB、Account2DB。表存储过程和函数都是相同的。我们需要开发一个 Web API 并提供一些插入和更新数据的服务。用户通过指定 AccountName 登录(比如从 WPF 应用程序,其中字段是 UserName、Password 和 Account ComboBox)。我们需要将连接字符串的初始目录设置为用户登录的帐户(实际上我们甚至需要在登录用户之前设置初始目录,因为我们需要根据帐户检查他的凭据)。
WPF 屏幕示例:
用户名:A
密码:秘密
账户:账户 1
当用户点击登录时,这就是我想要做的:
1:-> 将连接字符串中的初始目录设置为 Account1DB
2:-> 那么用户所做的所有数据库操作(包括身份验证)都应该在 Account1DB 架构上
我想采用数据库优先方法。如何解决这个问题?
提前致谢,
Abhilash D K
您可以更改从 DbContext 派生的 class 以将 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);
你当然可以改变,但不是首选。它可以在没有正确消息的情况下在运行时抛出异常,我挑战过这种情况。
你这样变;
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;
我们有一个数据库 (MySQL),比如 DemoDB。我们有不同的帐户使用数据库。因此,为每个帐户创建一个数据库,比如 Account1DB、Account2DB。表存储过程和函数都是相同的。我们需要开发一个 Web API 并提供一些插入和更新数据的服务。用户通过指定 AccountName 登录(比如从 WPF 应用程序,其中字段是 UserName、Password 和 Account ComboBox)。我们需要将连接字符串的初始目录设置为用户登录的帐户(实际上我们甚至需要在登录用户之前设置初始目录,因为我们需要根据帐户检查他的凭据)。
WPF 屏幕示例:
用户名:A
密码:秘密
账户:账户 1
当用户点击登录时,这就是我想要做的:
1:-> 将连接字符串中的初始目录设置为 Account1DB
2:-> 那么用户所做的所有数据库操作(包括身份验证)都应该在 Account1DB 架构上
我想采用数据库优先方法。如何解决这个问题?
提前致谢,
Abhilash D K
您可以更改从 DbContext 派生的 class 以将 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);
你当然可以改变,但不是首选。它可以在没有正确消息的情况下在运行时抛出异常,我挑战过这种情况。 你这样变;
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;