【问题标题】:Asp.Net Core 2.2 change database run-time by current userAsp.Net Core 2.2 按当前用户更改数据库运行时
【发布时间】:2019-06-14 22:37:52
【问题描述】:

我有一个使用 EF Core 的 ASP.NET Core 2.2 项目,供多个客户使用。每个客户都有自己的数据库,具有由 IRepository(动态加载的数据库集)管理的完全相同的模式。它是多子域项目,我想在 account.example.com 上登录使用,经过身份验证的用户将重定向到网站 B site.example.com 通过 Cookie Authentication 授权。

网站 A,位于 www.example.com

网站 B,位于 site.example.com -(我的应用程序)

网站 C,位于 account.example.com -(ASP.NET Identity -.Net Core 2.2)

public MydbContext(string dbName)
        { 
            this.Database.GetDbConnection().ChangeDatabase(dbName);

        }

但它得到了默认连接字符串,该字符串是在 startup.cs 类的 ConfigureServices 中添加的。如何使用 Session 将当前用户的连接字符串从 Cookie 存储在 HttpContext.User 中,并更改每个查询的 DBContext 的连接字符串。

【问题讨论】:

  • @RuardvanElburg 如何使用 Session 将当前用户的连接字符串从 Cookie 存储在 HttpContext.User 并通过 每个查询.
  • 我不确定您为什么要将连接字符串存储在 cookie 或会话中。一开始你是怎么设置的?当用户删除 cookie 或切换设备时会发生什么?您可以在 DbConnectionInfo 中访问会话:httpContextAccessor.HttpContext.Session。如果您需要在一个请求中访问不同的数据库,请考虑注入不同上下文的单独服务,或者考虑工厂模式。
  • @RuardvanElburg 我第一次这样做,但当我重定向到其他页面时,我收到错误session has not been configured for this application or request.

标签: c# entity-framework asp.net-core database-connection dbcontext


【解决方案1】:

您可以将连接字符串传递给您的构造函数并使用它。 EF Core 中的模式如下所示:

public class Db : DbContext
{
    readonly string connectionString;

    public Db(string connectionString)
    {
        this.connectionString = connectionString;
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
        base.OnConfiguring(optionsBuilder);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多