71 lines
2.6 KiB
C#
71 lines
2.6 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 身份认证 DbContext。
|
|
/// </summary>
|
|
public sealed class IdentityDbContext : DbContext
|
|
{
|
|
public IdentityDbContext(DbContextOptions<IdentityDbContext> options)
|
|
: base(options)
|
|
{
|
|
}
|
|
|
|
public DbSet<IdentityUser> IdentityUsers => Set<IdentityUser>();
|
|
public DbSet<MiniUser> MiniUsers => Set<MiniUser>();
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
ConfigureIdentityUser(modelBuilder.Entity<IdentityUser>());
|
|
ConfigureMiniUser(modelBuilder.Entity<MiniUser>());
|
|
}
|
|
|
|
private static void ConfigureIdentityUser(EntityTypeBuilder<IdentityUser> 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<string[], string>(
|
|
v => string.Join(',', v ?? Array.Empty<string>()),
|
|
v => string.IsNullOrWhiteSpace(v) ? Array.Empty<string>() : v.Split(',', StringSplitOptions.RemoveEmptyEntries));
|
|
|
|
var comparer = new ValueComparer<string[]>(
|
|
(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<MiniUser> 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();
|
|
}
|
|
}
|