在 Entity Framework 7 / MVC 6 上动态(根据请求)更改连接字符串
Change the connection string dynamically (per request) on Entity Framework 7 / MVC 6
我有一个 MVC 6 应用程序,我需要在该应用程序上连接到不同的数据库(即物理文件但相同的架构),具体取决于谁在访问它。
也就是说:Web 应用程序的每个客户都将其数据隔离在 SQL 数据库中(在 Azure 上,具有不同的性能、价格水平等),但所有这些数据库将共享相同的关系模式,当然, Entity Framework 上下文 class.
var cadConexion = @"Server=(localdb)\mssqllocaldb;Database=DBforCustomer1;Trusted_Connection=True;";
services.AddEntityFramework().AddSqlServer().AddDbContext<DAL.ContextoBD>(options => options.UseSqlServer(cadConexion));
问题是,如果我以这种方式注册服务,我已经将它绑定到具体客户的具体数据库,我不知道我是否可以在中间件执行开始时更改后者(这将是这是一个很好的观点,我知道是谁在敲门)。
我知道我可以构造数据库上下文,将连接字符串作为参数传递,但这意味着我应该在运行时(在管道的早期)为每个请求创建数据库上下文,我不知道是否这可能是低效的或不好的做法。此外,我认为这种方式我无法将数据库上下文注册为将其注入我的控制器的服务...
正确的做法是什么?有人在生产中有类似的配置吗?
提前致谢
首先,我不建议每个请求交换连接字符串。
但这不是问题。你可以这样做。您需要向 DbContext 传递一个新的连接字符串。
.AddDbContext
将连接字符串缓存在依赖项注入容器中,因此您无法使用 DI 使此方案起作用。相反,您需要自己实例化 DbContext 并向其传递一个新的连接字符串。
我宁愿不回答我自己的问题,但我觉得我必须为那些有类似问题的人提供指导,经过对互联网的长期深入研究,这样我可以节省他们很多时间测试多-连接场景,比较费力...
我终于使用了 Azure 的一项(最新)功能和 API,称为 "Elastic Database Tools",简而言之,这是 Microsoft 的一组工具,旨在解决这个具体问题,特别是针对 SaaS(软件即服务)场景(就像我的一样)。
这是一个很好的link开头:
https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-get-started/
祝您项目顺利!
我有一个 MVC 6 应用程序,我需要在该应用程序上连接到不同的数据库(即物理文件但相同的架构),具体取决于谁在访问它。 也就是说:Web 应用程序的每个客户都将其数据隔离在 SQL 数据库中(在 Azure 上,具有不同的性能、价格水平等),但所有这些数据库将共享相同的关系模式,当然, Entity Framework 上下文 class.
var cadConexion = @"Server=(localdb)\mssqllocaldb;Database=DBforCustomer1;Trusted_Connection=True;";
services.AddEntityFramework().AddSqlServer().AddDbContext<DAL.ContextoBD>(options => options.UseSqlServer(cadConexion));
问题是,如果我以这种方式注册服务,我已经将它绑定到具体客户的具体数据库,我不知道我是否可以在中间件执行开始时更改后者(这将是这是一个很好的观点,我知道是谁在敲门)。
我知道我可以构造数据库上下文,将连接字符串作为参数传递,但这意味着我应该在运行时(在管道的早期)为每个请求创建数据库上下文,我不知道是否这可能是低效的或不好的做法。此外,我认为这种方式我无法将数据库上下文注册为将其注入我的控制器的服务...
正确的做法是什么?有人在生产中有类似的配置吗?
提前致谢
首先,我不建议每个请求交换连接字符串。
但这不是问题。你可以这样做。您需要向 DbContext 传递一个新的连接字符串。
.AddDbContext
将连接字符串缓存在依赖项注入容器中,因此您无法使用 DI 使此方案起作用。相反,您需要自己实例化 DbContext 并向其传递一个新的连接字符串。
我宁愿不回答我自己的问题,但我觉得我必须为那些有类似问题的人提供指导,经过对互联网的长期深入研究,这样我可以节省他们很多时间测试多-连接场景,比较费力...
我终于使用了 Azure 的一项(最新)功能和 API,称为 "Elastic Database Tools",简而言之,这是 Microsoft 的一组工具,旨在解决这个具体问题,特别是针对 SaaS(软件即服务)场景(就像我的一样)。
这是一个很好的link开头:
https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-get-started/
祝您项目顺利!