C# 具有多个数据库的.Net核心应用程序中DBContext的体系结构(每个客户端1个)

C# 具有多个数据库的.Net核心应用程序中DBContext的体系结构(每个客户端1个),c#,architecture,entity-framework-core,multi-tenant,dbcontext,C#,Architecture,Entity Framework Core,Multi Tenant,Dbcontext,我继承了一个.Net Framework应用程序,它不是真正设计的,而是作为客户端的门户应用程序集成在一起的,但是出于安全和数据主权的考虑,每个客户端都有自己的数据库来存储数据。主页从共享数据库加载基本数据,但当用户导航到其中一个页面时,网站需要连接到其特定的数据库 该应用程序是用C#编写的,有角度,松散地遵循MVC,主上下文通过DI传递,我刚刚将其升级到.Net 5。由于在启动时可能有数千个客户端数据库无法注册为服务连接,因此我正在尝试找出处理这些特定于客户端的数据库的DBContext的最佳

我继承了一个.Net Framework应用程序,它不是真正设计的,而是作为客户端的门户应用程序集成在一起的,但是出于安全和数据主权的考虑,每个客户端都有自己的数据库来存储数据。主页从共享数据库加载基本数据,但当用户导航到其中一个页面时,网站需要连接到其特定的数据库

该应用程序是用C#编写的,有角度,松散地遵循MVC,主上下文通过DI传递,我刚刚将其升级到.Net 5。由于在启动时可能有数千个客户端数据库无法注册为服务连接,因此我正在尝试找出处理这些特定于客户端的数据库的DBContext的最佳方法。一般来说,它似乎遵循多租户原则,但以下是关注点

  • 如果可能的话,通过租户工厂或数据库拦截器避免代码重复或添加大量“=new DBContext”-使用DI会更好
  • 如果用户有以下情况,请确保连接用于正确的数据库: 打开不同客户端的多个选项卡
  • 确保在关闭客户端页面或用户登录时释放DB连接 返回主页以查看其他客户端

我意识到,我可以为每个请求创建一个新的DB上下文,每次都传递DB的名称,但是是否有一种模式或示例更适合这个用例?DB级别的DbCommandInterceptor之类的东西可能会起作用,但是如果有一些示例说明如何实现这一点,我可以找到它们。

最简单、最安全、最好的方法就是您所说的。为每个请求创建一个新的DbContext,通过某种多租户隔离方法指定数据库名称

DbContext设计为只在短期内使用。试图使其比请求的寿命更长将产生内存和安全问题。在多用户应用程序(如网站)中,切勿将DbContext设置为静态(或单例)


最佳实践是使用每个请求的生命周期注入DbContext。这将确保在请求完成后销毁DbContext,并清理所有内存。

对于租户上下文,请确保使用范围限定的
选项Lifetime
AddDbContext
之一。然后,您可以为每个实例提供不同的连接字符串,该字符串派生自任何其他作用域服务

services.AddDbContext((sp,o)=>{
var context=sp.GetService().context;
o、 UseSqlServer(…在此处获取连接字符串。从上下文。用户?…)
});