访问具有相同架构的多个数据库
Posted
技术标签:
【中文标题】访问具有相同架构的多个数据库【英文标题】:Accessing multiple databases with identical schemata 【发布时间】:2014-03-20 12:06:38 【问题描述】:我必须为multitenancy 系统实现一个系统,其中有多个(无固定限制)具有相同表结构的数据库或模式。
对于每个请求,都会提供某种数据库/模式 ID(如租户 ID)。 我想做的是根据该 ID 选择数据库或模式,并告诉我的实体框架模型(代码优先)以该特定数据库/模式为目标。 然后系统,一个 WCF 服务,将执行一些查询并等待下一次调用,目标(可能)另一个数据库/模式。 自然地,多个请求可以在不同的线程中同时执行,使用实体对象访问不同的数据库/模式。
我使用的是 SQL Server,租户数量可能在 5 到 50 之间。
有没有办法做到这一点?
顺便说一句,架构和数据库之间的 SQL Server 有区别吗?我知道有 oracle,但我对 SQL Server 还很陌生,还没有完全理解所有的微软术语。
很多问候! 沃尔克
【问题讨论】:
一个 [SQL Server] 数据库可以有多个模式。模式为单个数据库中的对象提供逻辑分组,通常用于安全/角色。在谈论“数据库模式”的同时谈论“模式”通常会令人困惑.. 【参考方案1】:是的,完全有可能。
DbContext
,您的上下文将从中继承,它有一个构造函数,它接收 ConnectionString 名称(在您的 web.config 中声明)或实际的 ConnectionString。因此,您可以动态构建 connectionString 并使用相同的 Context 类型连接到不同的数据库。
但是,考虑到您将创建一个 Context 实例,您不会同时将同一个 Context 实例用于多个数据库。
现在,在您的场景中,您必须考虑如何将某些特定的 id 解析为实际的数据库名称。您可以通过拥有一个额外的数据库来做到这一点,例如保存该信息的主数据库。
注意:如果要使用 EF 迁移,请小心。请务必将迁移应用到正确的数据库。
【讨论】:
【参考方案2】:使用 DbContext 的 OnModelCreating 事件,您可以设置默认架构。
看看https://docs.microsoft.com/en-us/ef/core/modeling/relational/default-schema
结合自定义 ConnectionString 构建器,您可以完成您的任务。
【讨论】:
以上是关于访问具有相同架构的多个数据库的主要内容,如果未能解决你的问题,请参考以下文章
在具有相同架构的多个数据库中使用 EF(或另一个 .NET ORM)
如何使用 dask/fastparquet 从多个目录中读取多个 parquet 文件(具有相同架构)
有没有办法在 JOOQ 中为具有相同表结构的多个模式设置代码生成?