using System; using System.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using TakeoutSaaS.Domain.Identity.Entities; namespace TakeoutSaaS.Infrastructure.Identity.Persistence; /// /// 身份认证 DbContext。 /// public sealed class IdentityDbContext : DbContext { public IdentityDbContext(DbContextOptions options) : base(options) { } public DbSet IdentityUsers => Set(); public DbSet MiniUsers => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { ConfigureIdentityUser(modelBuilder.Entity()); ConfigureMiniUser(modelBuilder.Entity()); } private static void ConfigureIdentityUser(EntityTypeBuilder builder) { builder.ToTable("identity_users"); builder.HasKey(x => x.Id); builder.Property(x => x.Account).HasMaxLength(64).IsRequired(); builder.Property(x => x.DisplayName).HasMaxLength(64).IsRequired(); builder.Property(x => x.PasswordHash).HasMaxLength(256).IsRequired(); builder.Property(x => x.Avatar).HasMaxLength(256); var converter = new ValueConverter( v => string.Join(',', v ?? Array.Empty()), v => string.IsNullOrWhiteSpace(v) ? Array.Empty() : v.Split(',', StringSplitOptions.RemoveEmptyEntries)); var comparer = new ValueComparer( (l, r) => l!.SequenceEqual(r!), v => v.Aggregate(0, (current, item) => HashCode.Combine(current, item.GetHashCode())), v => v.ToArray()); builder.Property(x => x.Roles) .HasConversion(converter) .Metadata.SetValueComparer(comparer); builder.Property(x => x.Permissions) .HasConversion(converter) .Metadata.SetValueComparer(comparer); builder.HasIndex(x => x.Account).IsUnique(); } private static void ConfigureMiniUser(EntityTypeBuilder builder) { builder.ToTable("mini_users"); builder.HasKey(x => x.Id); builder.Property(x => x.OpenId).HasMaxLength(128).IsRequired(); builder.Property(x => x.UnionId).HasMaxLength(128); builder.Property(x => x.Nickname).HasMaxLength(64).IsRequired(); builder.Property(x => x.Avatar).HasMaxLength(256); builder.HasIndex(x => x.OpenId).IsUnique(); } }