在 Entity Framework 7 / MVC 6 上动态更改连接字符串(每个请求)

Vi1*_*100 2 entity-framework-core asp.net-core-mvc azure-sql-database asp.net-core

我有一个 MVC 6 应用程序,我需要在该应用程序上连接到不同的数据库(即物理文件,但架构相同),具体取决于访问它的人。也就是说:Web 应用程序的每个客户都将其数据隔离在 SQL 数据库中(在 Azure 上,具有不同的性能、价格水平等),但所有这些数据库将共享相同的关系架构,当然还有实体框架上下文班级。

var cadConexion = @"Server=(localdb)\mssqllocaldb;Database=DBforCustomer1;Trusted_Connection=True;";
services.AddEntityFramework().AddSqlServer().AddDbContext<DAL.ContextoBD>(options => options.UseSqlServer(cadConexion));
Run Code Online (Sandbox Code Playgroud)

问题是,如果我以这种方式注册服务,我已将其绑定到具体客户的具体数据库,并且我不知道我是否可以在中间件执行开始时更改后者(这将是一个好点,因为我这样就可以知道是谁在敲门)。

我知道我可以构造数据库上下文,将连接字符串作为参数传递,但这意味着我应该在运行时(在管道的早期)为每个请求创建数据库上下文,我不知道这是否可能效率低下或不好的做法。此外,我认为这样我无法将数据库上下文注册为将其注入控制器的服务......

什么是正确的方法?有人在生产中使用类似的配置吗?

提前致谢

Vi1*_*100 5

我宁愿不回答我自己的问题,但我觉得我必须为那些有类似问题的人提供指导,经过对互联网的长期深入研究,这样我就可以为他们节省大量测试多连接场景的时间,至挺费劲的……

我终于使用了 Azure 的(最近的)功能和 API,称为“弹性数据库工具”,简而言之,它是 Microsoft 的一组工具,旨在解决这个具体问题,特别是针对 SaaS(软件即服务)场景(就像我的一样)。

这是一个很好的链接:

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-get-started/

祝你的项目好运!