using HuanMeng.DotNetCore.MultiTenant.Contract; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HuanMeng.DotNetCore.MultiTenant { /// /// 基本多租户DbContext /// public class MultiTenantDbContext : DbContext, IMultiTenantDbContext { /// /// 租户信息 /// public ITenantInfo? TenantInfo { get; set; } /// /// 构造函数 /// /// public MultiTenantDbContext(ITenantInfo? tenantInfo) { this.TenantInfo = tenantInfo; } /// /// 构造函数 /// /// /// public MultiTenantDbContext(ITenantInfo? tenantInfo, DbContextOptions options) : base(options) { if (tenantInfo == null) { tenantInfo = new TenantInfo() { TenantId = Guid.NewGuid(), Identifier = "default", Name = "default" }; } this.TenantInfo = tenantInfo; } public void SetTenantInfo(ITenantInfo tenantInfo) { this.TenantInfo = tenantInfo; } public override int SaveChanges() { if (TenantInfo?.TenantId != null) { var entries = ChangeTracker.Entries() .Where(e => e.Entity is IMultiTenantEntity && (e.State == EntityState.Added || e.State == EntityState.Modified)) .Select(e => e.Entity as IMultiTenantEntity) .ToList(); foreach (var entity in entries) { if (entity?.TenantId == null || entity?.TenantId == Guid.Empty) { entity.TenantId = TenantInfo.TenantId; } } } return base.SaveChanges(); } public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) { if (TenantInfo?.TenantId != null) { var entries = ChangeTracker.Entries() .Where(e => e.Entity is IMultiTenantEntity && (e.State == EntityState.Added || e.State == EntityState.Modified)) .Select(e => e.Entity as IMultiTenantEntity) .ToList(); foreach (var entity in entries) { if (entity?.TenantId == null || entity?.TenantId == Guid.Empty) { entity.TenantId = TenantInfo.TenantId; } } } return await base.SaveChangesAsync(cancellationToken); } } }