using Domain.Entities.Forum.Posts; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Persistence.Configurations.Forum.Posts; public sealed class PostCheerConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { // 글 삭제 시 응원 원장은 감사 목적으로 보존 (NoAction). 회원 삭제와의 다중 캐스케이드 경로 충돌도 회피. builder.HasOne(x => x.Post).WithMany().HasForeignKey(x => x.PostID).OnDelete(DeleteBehavior.NoAction); builder.HasOne(x => x.FromMember).WithMany().HasForeignKey(x => x.FromMemberID).OnDelete(DeleteBehavior.NoAction); builder.HasOne(x => x.ToMember).WithMany().HasForeignKey(x => x.ToMemberID).OnDelete(DeleteBehavior.NoAction); builder.ToTable(nameof(PostCheer), x => x.HasComment("분석글 응원(Cheer) — D3 M4")); builder.HasKey(x => x.ID); builder.Property(x => x.ID).ValueGeneratedOnAdd().HasComment("PK"); builder.Property(x => x.PostID).IsRequired().HasComment("응원 대상 게시글 ID"); builder.Property(x => x.FromMemberID).IsRequired().HasComment("응원 발신자 회원 ID"); builder.Property(x => x.ToMemberID).IsRequired().HasComment("응원 수신자(글 작성자) 회원 ID"); builder.Property(x => x.Amount).IsRequired().HasComment("총 응원 금액"); builder.Property(x => x.FeeAmount).IsRequired().HasComment("플랫폼 수수료(소각분)"); builder.Property(x => x.NetAmount).IsRequired().HasComment("작성자 수령 순액(Reward 적립)"); builder.Property(x => x.Message).HasMaxLength(100).HasComment("응원 한마디"); builder.Property(x => x.CreatedAt).IsRequired().HasComment("응원 일시"); builder.HasIndex(x => x.PostID); builder.HasIndex(x => new { x.ToMemberID, x.CreatedAt }); builder.HasIndex(x => new { x.FromMemberID, x.CreatedAt }); } }