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

时间:2015-08-25 16:45:10

标签: azure-sql-database asp.net-core asp.net-core-mvc entity-framework-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));

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

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

对此有何正确的解决方法?有人在制作方面有类似的配置吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

我宁愿不回答我自己的问题,但我觉得在经过长期深入的互联网研究后,我必须为那些有类似问题的人提供指导,这样我就可以节省大量时间测试多连接情景,这是非常费力的......

我最终使用了一个名为“弹性数据库工具”的(最新)功能和Azure API,简洁来说,它是微软的一套工具,旨在解决这个具体问题,特别是针对SaaS(软件为一个服务)场景(就像我的一样)。

以下是一个很好的链接:

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

祝你的项目好运!

答案 1 :(得分:1)

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

但那不是问题。你可以这样做。您需要为DbContext传递一个新的连接字符串。

.AddDbContext在依赖注入容器中缓存连接字符串,因此您无法使用DI来使此方案有效。相反,您需要自己实例化DbContext并将其传递给新的连接字符串。