繁体   English   中英

在 .NET 5 Web API 中动态连接到多个数据库(取决于经过身份验证的用户)

[英]Connecting to multiple databases, dynamically (depending on the authenticated user) in an .NET 5 Web API

我们目前有一个 CMS,我们的客户可以使用它来管理我们为他们制作的网站的内容和某些设置。 我们有一个包含所有客户列表的主数据库。 然后,每个客户都有自己的数据库,其中包含他们的所有数据。 我们总是先连接到主数据库,然后查找客户并使用该信息连接到客户的数据库并获取他们的数据。

我们正在努力在 .NET 5 中重建我们的 CMS(及其 API)。我们对所有服务和数据库连接使用依赖注入。 目前我们有一个IDatabaseConnection实现MySqlDatabaseConnectionMsSqlConnection 这有一些用于执行查询、启动事务等的功能。构造函数有一个IOptions<MySettings>来注入来自appSettings.json的设置,其中包含连接字符串。

这适用于主数据库,但我们正在尝试找出连接到客户数据库的最佳方式,因为这些数据库的连接字符串来自主数据库,我们事先并不知道它们。

我们一直在考虑为此创建一个工厂,但不确定在这种特定情况下如何做到这一点。 我们发现的另一件事是我们实现了多租户,但也不确定这是否是最好的方式。 我们也可以在我们的实现中添加一个空的构造函数,并在需要时手动创建实例并设置正确的连接字符串,但这似乎是一种反模式? 或者是否有可能注入我们的IDatabaseConnection的 2 个实例,然后为其中一个手动设置连接字符串?

当我们在线查找信息时,我们大多会遇到实体框架或其他 object 数据库映射器或使用 DbContext 的解决方案,但据我所知,我们不能使用类似的东西,因为我们的 CMS 也有动态查询和类似的东西那(如果您需要更多上下文,我可以对此进行更多解释)。

那么您对处理这样的用例有什么建议/建议吗? 您需要我们目前所拥有的任何代码示例吗?

几天前我遇到了同样的问题。

您可以通过以下方式即时更改连接字符串:

myDbContext.Database.GetDbConnection().ConnectionString = $@"Data Source=.\SqlExpress;Initial Catalog={dataasename};Integrated Security=True";

如果要使用自定义连接字符串,可以像这样创建 DbContext:

public static MyDbContext GetMyDbContext(string databaseName)
{
    var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();

    optionsBuilder.UseSqlServer($@"Data Source=.\SqlExpress;Initial Catalog={databaseName};Integrated Security=True");

    return new MyDbContext(optionsBuilder.Options);

}

暂无
暂无

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

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