我必须实现一个系统,其中有几个(没有固定限制)数据库或具有相同表格结构的模式,用于multitenancy系统。
对于每个请求,都提供某种数据库/模式ID(如租户ID)。 我想要做的是根据该ID选择数据库或模式,并告诉我的实体框架模型(代码优先)以该特定数据库/模式为目标。 然后,系统(WCF服务)将执行一些查询并等待下一次调用,目标(可能)是另一个数据库/模式。 当然,可以在不同的线程中同时执行多个请求,使用实体对象访问不同的数据库/模式。
我正在使用SQL Server,租户数量可能在5到50之间。
有没有办法实现这个目标?
顺便问一下,SQL Server在架构和数据库之间有区别吗?我知道有oracle,但我对SQL Server很新,并且还没有完全理解所有的微软术语。
很多问候! 沃尔克
答案 0 :(得分:0)
是的,这完全有可能。
DbContext
,您的上下文将从中继承,它有一个构造函数,它接收ConnectionString名称(在您的web.config中声明)或实际的ConnectionString。因此,您可以使用相同的Context类型动态构建connectionString并连接到不同的数据库。
但是,考虑到您将创建一个Context实例,您不会同时为多个数据库使用相同的Context实例。
现在,在您的方案中,您必须考虑如何将某些特定ID解析为实际数据库名称。您可以通过拥有一个额外的数据库来实现这一目标,例如将保存该信息的主数据库。
注意:如果您要使用EF迁移,请务必小心。务必将迁移应用到正确的数据库中。
答案 1 :(得分:0)
使用DbContext的OnModelCreatining事件,您可以设置默认架构。
看看https://docs.microsoft.com/en-us/ef/core/modeling/relational/default-schema
结合自定义的ConnectionString构建器,您可以完成任务。