在实体框架7 / MVC 6上动态改变连接字符串(每个请求)



我有一个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));

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

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

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

Thanks in advance

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

我终于使用了Azure的一个(最近的)功能和api,叫做"弹性数据库工具",简明地说,这是一组来自微软的工具,旨在解决这个具体问题,特别是针对SaaS(软件即服务)场景(就像我的一样)。

这里有一个很好的链接:

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

祝你项目顺利!

首先,我不建议每个请求交换连接字符串。

但这不是问题。你能做到的。您需要向DbContext传递一个新的连接字符串。

.AddDbContext在依赖注入容器中缓存连接字符串,因此您不能使用DI来使这个场景工作。相反,您需要自己实例化DbContext并向它传递一个新的连接字符串。

最新更新