68 lines
2.4 KiB
C#
68 lines
2.4 KiB
C#
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<User> Users { get; set; }
|
|
public DbSet<Bookmark> Bookmarks { get; set; }
|
|
public DbSet<Novel> Novels { get; set; }
|
|
public DbSet<Volume> Volumes { get; set; }
|
|
public DbSet<Chapter> Chapters { get; set; }
|
|
public DbSet<ReadingList> ReadingLists { get; set; }
|
|
public DbSet<ReadingListItem> ReadingListItems { get; set; }
|
|
|
|
public UserNovelDataServiceDbContext(DbContextOptions options, ILogger<UserNovelDataServiceDbContext> logger) : base(options, logger)
|
|
{
|
|
}
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
base.OnModelCreating(modelBuilder);
|
|
|
|
modelBuilder.Entity<Bookmark>(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<ReadingList>(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<ReadingListItem>(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);
|
|
});
|
|
}
|
|
}
|