feat(serial-code): add SerialCode + SerialCodeReward + ViewerSerialCodeRedemption entities
Three new EF entities for /campaign/regist_serial_code: SerialCodeEntry (code, message, window, enabled flag), SerialCodeRewardEntry (FK child, per-slot reward), and ViewerSerialCodeRedemption (composite-PK redemption record). Registered in SVSimDbContext with unique index on Code and cascade FK constraints. 3/3 persistence tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -108,6 +108,10 @@ public class SVSimDbContext : DbContext
|
||||
public DbSet<ArenaTwoPickReward> ArenaTwoPickRewards { get; set; } = null!;
|
||||
public DbSet<ViewerArenaTwoPickRun> ViewerArenaTwoPickRuns { get; set; } = null!;
|
||||
|
||||
public DbSet<SerialCodeEntry> SerialCodes => Set<SerialCodeEntry>();
|
||||
public DbSet<SerialCodeRewardEntry> SerialCodeRewards => Set<SerialCodeRewardEntry>();
|
||||
public DbSet<ViewerSerialCodeRedemption> ViewerSerialCodeRedemptions => Set<ViewerSerialCodeRedemption>();
|
||||
|
||||
#endregion
|
||||
|
||||
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||
@@ -418,6 +422,39 @@ public class SVSimDbContext : DbContext
|
||||
b.HasIndex(e => new { e.ViewerId, e.AcquireTime, e.Id });
|
||||
});
|
||||
|
||||
modelBuilder.Entity<SerialCodeEntry>(b =>
|
||||
{
|
||||
b.HasKey(e => e.Id);
|
||||
b.Property(e => e.Id).ValueGeneratedOnAdd();
|
||||
b.Property(e => e.Code).HasMaxLength(64).IsRequired();
|
||||
b.Property(e => e.Message).HasMaxLength(255);
|
||||
b.HasIndex(e => e.Code).IsUnique();
|
||||
b.HasMany(e => e.Rewards)
|
||||
.WithOne()
|
||||
.HasForeignKey(r => r.SerialCodeId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<SerialCodeRewardEntry>(b =>
|
||||
{
|
||||
b.HasKey(e => e.Id);
|
||||
b.Property(e => e.Id).ValueGeneratedOnAdd();
|
||||
b.HasIndex(e => new { e.SerialCodeId, e.Slot });
|
||||
});
|
||||
|
||||
modelBuilder.Entity<ViewerSerialCodeRedemption>(b =>
|
||||
{
|
||||
b.HasKey(e => new { e.ViewerId, e.SerialCodeId });
|
||||
b.HasOne<Viewer>()
|
||||
.WithMany()
|
||||
.HasForeignKey(e => e.ViewerId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
b.HasOne<SerialCodeEntry>()
|
||||
.WithMany()
|
||||
.HasForeignKey(e => e.SerialCodeId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
});
|
||||
|
||||
base.OnModelCreating(modelBuilder);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user