拥有自己的IdentityDbContext实现,我希望能够根据用户的选择连接到自定义数据库。所以我为默认数据库和用户选择的数据库创建了2个构造函数。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("Users", throwIfV1Schema: false)
{
//Aici am adaugat
Configuration.ProxyCreationEnabled = true;
Configuration.LazyLoadingEnabled = true;
}
public ApplicationDbContext(String connectionName)
: base(connectionName, throwIfV1Schema: false)
{
//Aici am adaugat
Configuration.ProxyCreationEnabled = true;
Configuration.LazyLoadingEnabled = true;
}
}
我现在的问题是将自定义connectionName
带入课程的方式。
在此方法中调用构造函数:
public static string conn;
public static ApplicationDbContext Create()
{
if(conn == null)
return new ApplicationDbContext();
else
return new ApplicationDbContext(conn);
}
使用会话变量是不可能的,因为在此上下文中HttpContext.Current
为空。向Create
方法添加字符串参数也是不可能的,因为在Startup
类中,在任何用户选择之前,Owin决定使用默认数据库:
app.CreatePerOwinContext(() => ApplicationDbContext.Create());
即使传递参数也无济于事,因为它不会被用户选中。
我该怎么办?
非常感谢!
答案 0 :(得分:0)
我会使用cookies。
试试这个:
<强> Startup.Auth.cs 强>
app.CreatePerOwinContext<ApplicationDbContext>(ApplicationDbContext.Create);
<强> ApplicationDbContext.cs 强>
public static ApplicationDbContext Create(IdentityFactoryOptions<ApplicationDbContext> options, IOwinContext context)
{
// Do things here.
string choice = context.Request.Cookies...;
// Make sure that the cookie is correct.
return new ApplicationDbContext(connectionName);
}
答案 1 :(得分:0)
您可以做的是使用一个静态类,使用提供程序来生成连接字符串。
然后,您可以让用户选择连接并将其存储在适合您的任何位置。提供程序将读取连接字符串并将其提供给上下文初始化程序。
通过这种方式,您可以在完成所有这些操作之前设置提供程序。如果您想进行单元测试,可以模拟它。
我是用手机写的。当我在桌面前时,我会用代码示例改进答案。
更新(我现在在桌面前):
实现这一点的最简单方法是通过添加一个构造函数来修改上下文类,该构造函数接受nameOrConnectionString参数并使用Create()方法调用该构造函数,该构造函数具有获取连接字符串的提供程序:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("aspNetIdentity", throwIfV1Schema: false)
{
}
public ApplicationDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext(ConnectionStringProvider.ConnectionString);
}
}
ConnectionStringProvider类是一个静态类,它为您保存连接字符串:
public static class ConnectionStringProvider
{
public static string ConnectionString { get; set; }
}
然后,您可以在启动时将连接字符串设置为默认值,然后让用户更改它。更改后,请存放在此房产中。
请注意,这是一个简单的答案,旨在表明可能的解决方案。请记住,由于类是静态的,因此只存在一个实例,连接字符串将提供给所有调用者,因此您需要使用依赖注入和会话/用户跟踪等概念来解释它。
例如,该类可以使用由依赖性解析程序管理的内部提供程序。然后让DI容器管理提供者的范围。