繁体   English   中英

如何使用变量连接字符串创建IdentityDbContext?

[英]How to create an IdentityDbContext with a variable connection string?

拥有我自己的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为null。 Create方法添加字符串参数也是不可能的,因为在Startup类中,在任何用户选择之前,Owin决定使用默认数据库:

app.CreatePerOwinContext(() => ApplicationDbContext.Create());

即使通过论证也无济于事,因为用户不会选择它。

我能做些什么呢?

非常感谢你!

我会用饼干。

尝试这个:

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);
}

你可以做的是有一个静态类,它使用提供程序来生成连接字符串。

然后,您可以让用户选择连接并将其存储在适合您的任何位置。 提供程序将读取连接字符串并将其提供给上下文初始值设定项。

这样,您可以在所有这些之前设置提供程序。 如果您想进行单元测试,可以模拟它。

我是用手机写的。 当我在桌面前时,我会用代码示例改进答案。

更新(我现在在桌面前):

实现此目的的最简单方法是通过添加一个构造函数来修改上下文类,该构造函数接受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容器管理提供者的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM