EF Core 多租户无内置支持,需按场景权衡:Database-per-Tenant(物理隔离、高安全)、Schema-per-Tenant(逻辑隔离、易维护)、Row-level Filtering(轻量但需严格审查),核心是租户上下文早于 DbContext 创建并贯穿请求链路。

EF Core 本身不内置多租户支持,但可以通过多种方式实现数据隔离,核心在于请求上下文感知 + 查询拦截 + 模型配置。关键不是“选哪种方案”,而是根据租户规模、隔离强度、运维成本和现有架构来权衡。
按数据库隔离(Database-per-Tenant)
每个租户独占一个数据库,物理级隔离,安全性最高,扩展性好,适合 SaaS 中大型客户或合规要求严的场景。
- 连接字符串需动态生成,通常从 HTTP 上下文(如 Host 头、路由、Token 声明)提取租户标识
- 在
IDbContextFactory或自定义DbContext构造时传入租户 ID,拼接出对应连接字符串 - 注意连接池管理:不同租户数据库不能共用连接池,EF Core 默认会按连接字符串区分,无需额外处理
- 迁移需为每个租户单独执行(可用
dotnet ef migrations script+ 脚本分发,或运行时调用MigrateAsync())
按 Schema 隔离(Schema-per-Tenant)
所有租户共享同一数据库,但各自拥有独立 Schema(如 PostgreSQL/SQL Server),逻辑隔离,兼顾安全与维护效率。
- 在
OnModelCreating中通过entity.ToTable("Users", tenantSchemaName)统一指定 Schema - 确保每次 DbContext 实例化时已知租户 Schema 名(可从依赖注入容器中解析
ITenantContext) - 建库脚本或迁移需支持创建 Schema(SQL Server 可用
CREATE SCHEMA;PostgreSQL 自动支持) - 注意:SQL Server 中
DefaultSchema是全局设置,无法 per-context 覆盖,必须显式调用ToTable(..., schema)
按数据行过滤(Row-level Filtering)
所有租户数据混存在同一张表,靠查询自动附加 TenantId == current 条件,开发最轻量,但依赖严格审查,适合内部系统或租户间无强隔离需求的场景。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~