using FictionArchive.Service.Shared.Services.Database; using FictionArchive.Service.UserNovelDataService.Models.Database; using Microsoft.EntityFrameworkCore; namespace FictionArchive.Service.UserNovelDataService.Services; public class UserNovelDataServiceDbContext : FictionArchiveDbContext { public DbSet Users { get; set; } public DbSet Bookmarks { get; set; } public DbSet Novels { get; set; } public DbSet Volumes { get; set; } public DbSet Chapters { get; set; } public DbSet ReadingLists { get; set; } public DbSet ReadingListItems { get; set; } public UserNovelDataServiceDbContext(DbContextOptions options, ILogger logger) : base(options, logger) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { // Unique constraint: one bookmark per chapter per user entity.HasIndex(b => new { b.UserId, b.ChapterId }).IsUnique(); // Index for efficient "get bookmarks for novel" queries entity.HasIndex(b => new { b.UserId, b.NovelId }); // User relationship entity.HasOne(b => b.User) .WithMany() .HasForeignKey(b => b.UserId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { // Index for fetching user's lists entity.HasIndex(r => r.UserId); // User relationship with cascade delete entity.HasOne(r => r.User) .WithMany() .HasForeignKey(r => r.UserId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { // Unique constraint: one entry per novel per list entity.HasIndex(i => new { i.ReadingListId, i.NovelId }).IsUnique(); // Index for efficient ordered retrieval entity.HasIndex(i => new { i.ReadingListId, i.Order }); // ReadingList relationship with cascade delete entity.HasOne(i => i.ReadingList) .WithMany(r => r.Items) .HasForeignKey(i => i.ReadingListId) .OnDelete(DeleteBehavior.Cascade); }); } }