using Fengling.Platform.Domain.AggregatesModel.GatewayAggregate; using Fengling.Platform.Domain.AggregatesModel.RoleAggregate; using Fengling.Platform.Domain.AggregatesModel.TenantAggregate; using Fengling.Platform.Domain.AggregatesModel.UserAggregate; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Fengling.Platform.Infrastructure; public class PlatformDbContext(DbContextOptions options) : IdentityDbContext(options) { public DbSet Tenants => Set(); public DbSet AccessLogs => Set(); public DbSet AuditLogs => Set(); // Gateway 实体 public DbSet GwTenantRoutes => Set(); public DbSet GwClusters => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { if (modelBuilder is null) { throw new ArgumentNullException(nameof(modelBuilder)); } modelBuilder.Entity(entity => { entity.Property(e => e.PhoneNumber).HasMaxLength(20); entity.HasIndex(e => e.PhoneNumber).IsUnique(); entity.OwnsOne(e => e.TenantInfo, navigationBuilder => { navigationBuilder.Property(t => t.TenantCode).HasColumnName("TenantCode"); navigationBuilder.Property(t => t.TenantId).HasColumnName("TenantId"); navigationBuilder.Property(t => t.TenantName).HasColumnName("TenantName"); navigationBuilder.WithOwner(); }); }); modelBuilder.Entity(entity => { entity.Property(e => e.Description).HasMaxLength(200); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.CreatedAt); entity.HasIndex(e => e.UserName); entity.HasIndex(e => e.TenantId); entity.HasIndex(e => e.Action); entity.HasIndex(e => e.Status); entity.Property(e => e.UserName).HasMaxLength(50); entity.Property(e => e.TenantId).HasMaxLength(50); entity.Property(e => e.Action).HasMaxLength(20); entity.Property(e => e.Resource).HasMaxLength(200); entity.Property(e => e.Method).HasMaxLength(10); entity.Property(e => e.IpAddress).HasMaxLength(50); entity.Property(e => e.UserAgent).HasMaxLength(500); entity.Property(e => e.Status).HasMaxLength(20); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.CreatedAt); entity.HasIndex(e => e.Operator); entity.HasIndex(e => e.TenantId); entity.HasIndex(e => e.Operation); entity.HasIndex(e => e.Action); entity.Property(e => e.Operator).HasMaxLength(50); entity.Property(e => e.TenantId).HasMaxLength(50); entity.Property(e => e.Operation).HasMaxLength(20); entity.Property(e => e.Action).HasMaxLength(20); entity.Property(e => e.TargetType).HasMaxLength(50); entity.Property(e => e.TargetName).HasMaxLength(100); entity.Property(e => e.IpAddress).HasMaxLength(50); entity.Property(e => e.Description).HasMaxLength(500); entity.Property(e => e.Status).HasMaxLength(20); }); // Gateway 实体配置 modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.TenantCode).HasMaxLength(50); entity.Property(e => e.ServiceName).HasMaxLength(100).IsRequired(); entity.Property(e => e.ClusterId).HasMaxLength(100).IsRequired(); entity.Property(e => e.AuthorizationPolicy).HasMaxLength(100); entity.Property(e => e.CorsPolicy).HasMaxLength(100); entity.Property(e => e.RateLimiterPolicy).HasMaxLength(100); // 枚举转换为字符串 entity.Property(e => e.LoadBalancingPolicy) .HasConversion( v => v.HasValue ? v.Value.ToString() : null, v => v != null ? Enum.Parse(v) : null ) .HasMaxLength(50); // 值对象映射为 JSON 列 entity.OwnsOne(e => e.Match, navigationBuilder => { navigationBuilder.ToJson(); }); // 转换规则映射为 JSON 列 entity.OwnsMany(e => e.Transforms, navigationBuilder => { navigationBuilder.ToJson(); }); entity.HasIndex(e => e.TenantCode); entity.HasIndex(e => e.ServiceName); entity.HasIndex(e => e.ClusterId); entity.HasIndex(e => new { e.ServiceName, e.IsGlobal, e.Status }); }); // GwCluster 聚合根配置 modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.ClusterId).HasMaxLength(100).IsRequired(); entity.Property(e => e.Name).HasMaxLength(100).IsRequired(); entity.Property(e => e.Description).HasMaxLength(500); // 枚举转换为字符串 entity.Property(e => e.LoadBalancingPolicy) .HasConversion( v => v.ToString(), v => Enum.Parse(v) ) .HasMaxLength(50); entity.HasIndex(e => e.ClusterId).IsUnique(); entity.HasIndex(e => e.Name); entity.HasIndex(e => e.Status); // 配置内嵌的目标端点列表 entity.OwnsMany(e => e.Destinations, owned => { owned.WithOwner().HasForeignKey("ClusterId"); owned.Property("ClusterId").HasMaxLength(100); owned.Property(d => d.DestinationId).HasMaxLength(100).IsRequired(); owned.Property(d => d.Address).HasMaxLength(200).IsRequired(); owned.Property(d => d.Health).HasMaxLength(200); owned.HasIndex("ClusterId", "DestinationId"); }); // 配置内嵌健康检查配置(JSON 列) entity.OwnsOne(e => e.HealthCheck, owned => { owned.ToJson(); }); // 配置内嵌会话亲和配置(JSON 列) entity.OwnsOne(e => e.SessionAffinity, owned => { owned.ToJson(); }); }); modelBuilder.ApplyConfigurationsFromAssembly(typeof(PlatformDbContext).Assembly); base.OnModelCreating(modelBuilder); } }