dramaling-app/apps/backend/DramaLing.Infrastructure/Data/ApplicationDbContext.cs

99 lines
3.1 KiB
C#

using DramaLing.Core.Entities;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace DramaLing.Infrastructure.Data;
public class ApplicationDbContext : IdentityDbContext<User, IdentityRole<Guid>, Guid>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
// Learning Content
public DbSet<LearningStage> LearningStages { get; set; }
public DbSet<Scenario> Scenarios { get; set; }
public DbSet<Vocabulary> Vocabularies { get; set; }
// User Progress
public DbSet<UserProgress> UserProgresses { get; set; }
public DbSet<VocabularyProgress> VocabularyProgresses { get; set; }
// Gamification
public DbSet<Achievement> Achievements { get; set; }
public DbSet<UserAchievement> UserAchievements { get; set; }
public DbSet<DailyMission> DailyMissions { get; set; }
public DbSet<UserDailyMission> UserDailyMissions { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Configure Identity tables to use Guid
builder.Entity<User>(entity =>
{
entity.ToTable("Users");
entity.HasKey(e => e.Id);
// Configure indexes
entity.HasIndex(e => e.Email).IsUnique();
entity.HasIndex(e => e.UserName).IsUnique();
// Configure properties
entity.Property(e => e.DisplayName).HasMaxLength(100).IsRequired();
entity.Property(e => e.CurrentLanguage).HasMaxLength(5).IsRequired();
entity.Property(e => e.NativeLanguage).HasMaxLength(5).IsRequired();
entity.Property(e => e.CurrentLevel).HasMaxLength(5).IsRequired();
});
builder.Entity<IdentityRole<Guid>>(entity =>
{
entity.ToTable("Roles");
});
builder.Entity<IdentityUserRole<Guid>>(entity =>
{
entity.ToTable("UserRoles");
});
builder.Entity<IdentityUserClaim<Guid>>(entity =>
{
entity.ToTable("UserClaims");
});
builder.Entity<IdentityUserLogin<Guid>>(entity =>
{
entity.ToTable("UserLogins");
});
builder.Entity<IdentityRoleClaim<Guid>>(entity =>
{
entity.ToTable("RoleClaims");
});
builder.Entity<IdentityUserToken<Guid>>(entity =>
{
entity.ToTable("UserTokens");
});
// Configure soft delete
builder.Entity<User>()
.HasQueryFilter(e => !e.IsDeleted);
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
foreach (var entry in ChangeTracker.Entries<BaseEntity>())
{
switch (entry.State)
{
case EntityState.Modified:
entry.Entity.UpdatedAt = DateTime.UtcNow;
break;
}
}
return await base.SaveChangesAsync(cancellationToken);
}
}