// using System; using Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable namespace Infrastructure.Migrations.AppDb { [DbContext(typeof(AppDbContext))] [Migration("20260707002136_AddMacroData")] partial class AddMacroData { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("ProductVersion", "10.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("CreatedBy") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("제재 등록자"); b.Property("ExpiresAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int") .HasComment("제재 대상 회원 ID"); b.Property("Reason") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("제재 사유"); b.Property("RoomKey") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("제재 룸 키 (NULL=전체)"); b.HasKey("ID"); b.HasIndex("MemberID", "ExpiresAt"); b.ToTable("ChatBan", null, t => { t.HasComment("채팅 제재 (RoomKey NULL=전체, ExpiresAt NULL=무기한)"); }); }); modelBuilder.Entity("Domain.Entities.Chat.ChatRoomConfig", b => { b.Property("RoomKey") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("룸 키"); b.Property("IsActive") .HasColumnType("bit") .HasComment("활성 여부 (종목방 단계 오픈 게이트)"); b.Property("Notice") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("상단 고정 공지"); b.Property("SlowModeSeconds") .HasColumnType("smallint") .HasComment("슬로우 모드 (초)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("RoomKey"); b.ToTable("ChatRoomConfig", null, t => { t.HasComment("채팅방 설정 (main | stock:{code})"); }); }); modelBuilder.Entity("Domain.Entities.Common.Config", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("LastUpdatedAt") .HasColumnType("datetime2") .HasComment("마지막 수정일시"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion") .HasComment("동시성 제어용"); b.HasKey("ID"); b.ToTable("Config", null, t => { t.HasComment("운영 정보 설정 값"); }); }); modelBuilder.Entity("Domain.Entities.Common.EmailLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Category") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("카테고리 (auth.register, forum.post.notify 등)"); b.Property("CreatedAt") .ValueGeneratedOnAdd() .HasColumnType("datetime2") .HasDefaultValueSql("GETUTCDATE()") .HasComment("등록 시각 (UTC)"); b.Property("FailedAt") .HasColumnType("datetime2") .HasComment("실패 확정 시각 (UTC)"); b.Property("LastError") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("마지막 오류 메시지"); b.Property("MaxRetryCount") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(3) .HasComment("최대 재시도 횟수"); b.Property("MessageHtml") .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("HTML 본문"); b.Property("MessageText") .HasColumnType("nvarchar(max)") .HasComment("텍스트 본문 (선택)"); b.Property("NextRetryAt") .ValueGeneratedOnAdd() .HasColumnType("datetime2") .HasDefaultValueSql("GETUTCDATE()") .HasComment("다음 시도 시각 (UTC)"); b.Property("ProcessedAt") .HasColumnType("datetime2") .HasComment("처리 완료 시각 (UTC)"); b.Property("RetryCount") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(0) .HasComment("재시도 횟수"); b.Property("Status") .ValueGeneratedOnAdd() .HasColumnType("tinyint") .HasDefaultValue((byte)0) .HasComment("상태 (0=Pending, 1=Processing, 2=Sent, 3=Failed)"); b.Property("Subject") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("제목"); b.Property("ToAddress") .IsRequired() .HasMaxLength(256) .HasColumnType("nvarchar(256)") .HasComment("수신자 이메일"); b.HasKey("ID"); b.HasIndex("CreatedAt") .HasDatabaseName("IX_EmailLog_CreatedAt"); b.HasIndex("Status", "NextRetryAt") .HasDatabaseName("IX_EmailLog_Status_NextRetryAt"); b.ToTable("EmailLog", null, t => { t.HasComment("이메일 발송 큐"); }); }); modelBuilder.Entity("Domain.Entities.Director.AdminAccessLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("생성 일시"); b.Property("ElapsedMs") .HasColumnType("bigint") .HasComment("처리 시간 (밀리초)"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP 주소"); b.Property("MenuName") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("메뉴 이름"); b.Property("Method") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("HTTP Method"); b.Property("Path") .IsRequired() .HasMaxLength(2048) .HasColumnType("nvarchar(2048)") .HasComment("요청 경로"); b.Property("QueryString") .HasMaxLength(2048) .HasColumnType("nvarchar(2048)") .HasComment("쿼리 스트링"); b.Property("StatusCode") .HasColumnType("int") .HasComment("응답 상태 코드"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.Property("UserID") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)") .HasComment("관리자 사용자 ID"); b.Property("UserName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("관리자 사용자 이름"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("UserID"); b.ToTable("AdminAccessLog", null, t => { t.HasComment("관리자 접근 기록"); }); }); modelBuilder.Entity("Domain.Entities.Director.AdminLoginLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Account") .IsRequired() .HasMaxLength(120) .HasColumnType("nvarchar(120)") .HasComment("로그인 시도 계정"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("생성 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP 주소"); b.Property("Reason") .HasMaxLength(225) .HasColumnType("nvarchar(225)") .HasComment("실패 사유"); b.Property("Success") .HasColumnType("bit") .HasComment("로그인 성공 여부"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("Account"); b.HasIndex("CreatedAt"); b.ToTable("AdminLoginLog", null, t => { t.HasComment("관리자 로그인 기록"); }); }); modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyNumber", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("Code"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Email") .IsRequired() .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("이메일"); b.Property("Expiration") .HasColumnType("datetime2") .HasComment("만료 일시"); b.Property("IsVerified") .HasColumnType("bit") .HasComment("인증 여부"); b.Property("Type") .HasColumnType("int") .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)"); b.HasKey("ID"); b.HasIndex("Code"); b.HasIndex("Email"); b.HasIndex("Expiration"); b.HasIndex("IsVerified"); b.HasIndex("Type"); b.HasIndex("Type", "Code"); b.HasIndex("Type", "Code", "IsVerified"); b.ToTable("EmailVerifyNumber", null, t => { t.HasComment("이메일 인증 번호들"); }); }); modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyToken", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Additional") .HasColumnType("nvarchar(max)") .HasComment("추가 정보(JSON)"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Email") .IsRequired() .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("이메일"); b.Property("Expiration") .HasColumnType("datetime2") .HasComment("만료 일시"); b.Property("IsVerified") .HasColumnType("bit") .HasComment("인증 여부"); b.Property("Token") .IsRequired() .HasMaxLength(256) .HasColumnType("nvarchar(256)") .HasComment("Token"); b.Property("Type") .HasColumnType("int") .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)"); b.HasKey("ID"); b.HasIndex("Email"); b.HasIndex("Expiration"); b.HasIndex("IsVerified"); b.HasIndex("Token"); b.HasIndex("Type"); b.HasIndex("Type", "Email", "Token"); b.HasIndex("Type", "Email", "Token", "IsVerified"); b.ToTable("EmailVerifyToken", null, t => { t.HasComment("이메일 인증 토큰들"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("MemberID") .HasColumnType("int"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("MemberID"); b.HasIndex("FeedPostID", "MemberID") .IsUnique(); b.HasIndex("MemberID", "CreatedAt") .IsDescending(false, true); b.ToTable("FeedBookmark", null, t => { t.HasComment("피드 포스트 북마크"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Content") .IsRequired() .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") .HasComment("댓글 내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DeletedAt") .HasColumnType("datetime2") .HasComment("삭제 일시"); b.Property("Depth") .HasColumnType("smallint") .HasComment("중첩 깊이 (0 = 루트)"); b.Property("FeedPostID") .HasColumnType("int") .HasComment("FeedPost ID"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("IsDeleted") .HasColumnType("bit") .HasComment("삭제 여부"); b.Property("Likes") .HasColumnType("int") .HasComment("좋아요 수"); b.Property("MemberID") .HasColumnType("int") .HasComment("작성 회원 ID"); b.Property("ParentID") .HasColumnType("int") .HasComment("부모 댓글 ID (대댓글용)"); b.Property("Replies") .HasColumnType("int") .HasComment("자식 댓글 수"); b.Property("Reports") .HasColumnType("int") .HasComment("신고 수"); b.Property("Score") .HasColumnType("int") .HasComment("랭킹 스코어"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("MemberID"); b.HasIndex("ParentID"); b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "CreatedAt") .IsDescending(false, false, false, true); b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "Score", "ID") .IsDescending(false, false, false, true, true); b.HasIndex("FeedPostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt") .IsDescending(false, false, false, false, true); b.ToTable("FeedComment", null, t => { t.HasComment("피드 댓글 (Reddit식 계층형)"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedCommentID") .HasColumnType("int"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("MemberID") .HasColumnType("int"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)"); b.HasKey("ID"); b.HasIndex("FeedCommentID"); b.HasIndex("FeedPostID"); b.HasIndex("MemberID"); b.HasIndex("FeedCommentID", "MemberID") .IsUnique(); b.ToTable("FeedCommentLike", null, t => { t.HasComment("피드 댓글 좋아요"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("MemberID") .HasColumnType("int"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("MemberID"); b.HasIndex("FeedPostID", "MemberID") .IsUnique(); b.ToTable("FeedLike", null, t => { t.HasComment("피드 포스트 좋아요"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Bookmarks") .HasColumnType("int") .HasComment("북마크 수"); b.Property("Comments") .HasColumnType("int") .HasComment("댓글 수"); b.Property("Content") .IsRequired() .HasMaxLength(5000) .HasColumnType("nvarchar(max)") .HasComment("본문"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DeletedAt") .HasColumnType("datetime2") .HasComment("삭제 일시"); b.Property("Images") .HasColumnType("tinyint") .HasComment("이미지 개수"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("작성자 IP"); b.Property("IsDeleted") .HasColumnType("bit") .HasComment("삭제 여부"); b.Property("Likes") .HasColumnType("int") .HasComment("좋아요 수"); b.Property("Medias") .HasColumnType("tinyint") .HasComment("미디어 개수"); b.Property("MemberID") .HasColumnType("int") .HasComment("작성 회원 ID"); b.Property("Reports") .HasColumnType("int") .HasComment("신고 수"); b.Property("Tags") .HasColumnType("tinyint") .HasComment("태그 개수"); b.Property("Thumbnail") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("썸네일 URL"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("작성자 User-Agent"); b.Property("Views") .HasColumnType("int") .HasComment("조회수"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("IsDeleted"); b.HasIndex("MemberID"); b.HasIndex("IsDeleted", "CreatedAt"); b.HasIndex("MemberID", "IsDeleted", "CreatedAt"); b.HasIndex("IsDeleted", "Likes", "Comments", "Views"); b.ToTable("FeedPost", null, t => { t.HasComment("피드 포스트"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ContentType") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("MIME"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2") .HasComment("비활성 일시"); b.Property("Extension") .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("확장자"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("FileName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("원본 파일명"); b.Property("HashedName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("저장 파일명(해시)"); b.Property("Height") .HasColumnType("smallint") .HasComment("세로 픽셀"); b.Property("IsDisabled") .HasColumnType("bit") .HasComment("비활성 여부"); b.Property("Path") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("상대 경로"); b.Property("Size") .HasColumnType("bigint") .HasComment("바이트 크기"); b.Property("UUID") .HasColumnType("uniqueidentifier") .HasComment("UUID"); b.Property("Url") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("접근 URL"); b.Property("Width") .HasColumnType("smallint") .HasComment("가로 픽셀"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("UUID") .IsUnique(); b.HasIndex("FeedPostID", "HashedName"); b.HasIndex("FeedPostID", "IsDisabled"); b.ToTable("FeedPostImage", null, t => { t.HasComment("피드 포스트 이미지"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("Url") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("미디어 URL"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.ToTable("FeedPostMedia", null, t => { t.HasComment("피드 포스트 미디어 링크"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("Length") .HasColumnType("int") .HasComment("길이"); b.Property("MemberID") .HasColumnType("int"); b.Property("RawHandle") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)") .HasComment("원문 @handle"); b.Property("Start") .HasColumnType("int") .HasComment("본문 내 시작 인덱스"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("MemberID"); b.HasIndex("FeedPostID", "MemberID") .IsUnique(); b.HasIndex("MemberID", "CreatedAt") .IsDescending(false, true); b.ToTable("FeedPostMention", null, t => { t.HasComment("피드 포스트 멘션"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FeedPostID") .HasColumnType("int"); b.Property("FeedTagID") .HasColumnType("int"); b.HasKey("ID"); b.HasIndex("FeedPostID"); b.HasIndex("FeedTagID"); b.HasIndex("FeedPostID", "FeedTagID") .IsUnique(); b.HasIndex("FeedTagID", "CreatedAt") .IsDescending(false, true); b.ToTable("FeedPostTag", null, t => { t.HasComment("피드 포스트-태그 조인"); }); }); modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("태그 이름"); b.Property("Slug") .IsRequired() .HasMaxLength(120) .HasColumnType("nvarchar(120)") .HasComment("태그 슬러그 (URL용)"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UsageCount") .HasColumnType("bigint") .HasComment("사용 횟수"); b.HasKey("ID"); b.HasIndex("Name") .IsUnique(); b.HasIndex("Slug") .IsUnique(); b.HasIndex("UsageCount") .IsDescending(); b.ToTable("FeedTag", null, t => { t.HasComment("피드 태그 마스터"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardGroupID") .HasColumnType("int") .HasComment("분류 ID"); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("게시판 주소"); b.Property("Comments") .HasColumnType("int") .HasComment("댓글 수"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("IsSearch") .HasColumnType("bit") .HasComment("검색 여부"); b.Property("Name") .IsRequired() .HasMaxLength(70) .HasColumnType("nvarchar(70)") .HasComment("게시판 이름"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("Posts") .HasColumnType("int") .HasComment("게시글 수"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("BoardGroupID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("Comments"); b.HasIndex("IsActive"); b.HasIndex("IsSearch"); b.HasIndex("Name"); b.HasIndex("Order"); b.HasIndex("Posts"); b.HasIndex("Code", "IsActive"); b.HasIndex("Code", "IsSearch"); b.HasIndex("IsSearch", "IsActive"); b.ToTable("Board", null, t => { t.HasComment("게시판"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Boards") .HasColumnType("smallint") .HasComment("게시판 수"); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("게시판 분류 주소"); b.Property("Comments") .HasColumnType("int") .HasComment("댓글 수"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Name") .IsRequired() .HasMaxLength(70) .HasColumnType("nvarchar(70)") .HasComment("게시판 분류 명"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("Posts") .HasColumnType("int") .HasComment("게시글 수"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("Order"); b.HasIndex("Order", "CreatedAt"); b.HasIndex("Code", "Order", "CreatedAt"); b.ToTable("BoardGroup", null, t => { t.HasComment("게시판 분류"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CanDelete") .HasColumnType("bit") .HasComment("삭제 권한"); b.Property("CanEdit") .HasColumnType("bit") .HasComment("수정 권한"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("MemberID") .HasColumnType("int") .HasComment("관리자 ID"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("MemberID"); b.HasIndex("BoardID", "MemberID"); b.ToTable("BoardManager", null, t => { t.HasComment("게시판 관리자"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.HasKey("ID"); b.HasIndex("BoardID") .IsUnique(); b.ToTable("BoardMeta", null, t => { t.HasComment("게시판 설정"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("Color") .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("색상"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Name") .IsRequired() .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("말머리"); b.Property("Order") .HasColumnType("smallint") .HasComment("정렬 순서"); b.Property("Posts") .HasColumnType("int") .HasComment("사용 게시글 수"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("BoardID", "IsActive", "Order", "CreatedAt"); b.ToTable("BoardPrefix", null, t => { t.HasComment("게시판 말머리"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("Content") .IsRequired() .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("댓글 내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DeletedAt") .HasColumnType("datetime2"); b.Property("Depth") .HasColumnType("smallint") .HasComment("댓글 깊이"); b.Property("Dislikes") .HasColumnType("int"); b.Property("Email") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("Files") .HasColumnType("tinyint"); b.Property("Images") .HasColumnType("int"); b.Property("IpAddress") .HasColumnType("nvarchar(max)"); b.Property("IsDeleted") .HasColumnType("bit") .HasComment("삭제 여부"); b.Property("IsReply") .HasColumnType("bit"); b.Property("IsSecret") .HasColumnType("bit"); b.Property("Likes") .HasColumnType("int"); b.Property("Medias") .HasColumnType("tinyint"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("MentionMemberID") .HasColumnType("int") .HasComment("언급 대상 회원 ID"); b.Property("Name") .HasColumnType("nvarchar(max)"); b.Property("ParentID") .HasColumnType("int") .HasComment("부모 댓글 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Replies") .HasColumnType("int"); b.Property("Reports") .HasColumnType("int"); b.Property("SID") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("Score") .HasColumnType("int") .HasComment("점수"); b.Property("Status") .HasColumnType("tinyint") .HasComment("댓글 상태"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("UserAgent") .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("MemberID"); b.HasIndex("MentionMemberID"); b.HasIndex("ParentID"); b.HasIndex("PostID"); b.HasIndex("PostID", "IsDeleted", "ParentID", "CreatedAt") .IsDescending(false, false, false, true); b.HasIndex("PostID", "IsDeleted", "ParentID", "Score", "ID") .IsDescending(false, false, false, true, true); b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt") .IsDescending(false, false, false, false, true); b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "Score", "ID") .IsDescending(false, false, false, false, true, true); b.ToTable("Comment", null, t => { t.HasComment("댓글"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CommentID") .HasColumnType("int"); b.Property("ContentType") .HasColumnType("nvarchar(max)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("Downloads") .HasColumnType("int"); b.Property("Extension") .HasColumnType("nvarchar(max)"); b.Property("FileName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("HashedName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("Path") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("PostID") .HasColumnType("int"); b.Property("Size") .HasColumnType("bigint"); b.Property("UUID") .HasColumnType("uniqueidentifier"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("PostID"); b.HasIndex("UUID") .IsUnique(); b.ToTable("CommentFile", null, t => { t.HasComment("댓글 파일"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CommentID") .HasColumnType("int"); b.Property("ContentType") .HasColumnType("nvarchar(max)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("Extension") .HasColumnType("nvarchar(max)"); b.Property("FileName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("HashedName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("Height") .HasColumnType("smallint"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("Path") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("PostID") .HasColumnType("int"); b.Property("Size") .HasColumnType("bigint"); b.Property("UUID") .HasColumnType("uniqueidentifier"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("Width") .HasColumnType("smallint"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("PostID"); b.HasIndex("UUID") .IsUnique(); b.ToTable("CommentImage", null, t => { t.HasComment("댓글 이미지"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("Clicks") .HasColumnType("int"); b.Property("CommentID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("PostID") .HasColumnType("int"); b.Property("UUID") .HasColumnType("uniqueidentifier"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("PostID"); b.ToTable("CommentLink", null, t => { t.HasComment("댓글 링크"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CommentID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("PostID") .HasColumnType("int"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("PostID"); b.ToTable("CommentMedia", null, t => { t.HasComment("댓글 미디어"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Length") .HasColumnType("int") .HasComment("길이"); b.Property("MemberID") .HasColumnType("int") .HasComment("언급된 회원 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("RawHandle") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)") .HasComment("원문 회원 언급값"); b.Property("Start") .HasColumnType("int") .HasComment("본문 내 시작 인덱스"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID") .IsUnique(); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("CommentID", "ID"); b.HasIndex("CommentID", "MemberID", "ID"); b.HasIndex("CommentID", "MemberID", "Start"); b.ToTable("CommentMention", null, t => { t.HasComment("댓글 멘션"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Reaction") .HasColumnType("tinyint") .HasComment("반응 구분"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-agent"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("CreatedAt"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("Reaction"); b.HasIndex("CommentID", "ID"); b.HasIndex("CommentID", "MemberID") .IsUnique(); b.ToTable("CommentReaction", null, t => { t.HasComment("댓글 반응"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Memo") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("처리 내용"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Reason") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("신고 내용"); b.Property("Status") .HasColumnType("tinyint") .HasComment("처리 상태"); b.Property("Type") .HasColumnType("tinyint") .HasComment("신고 사유"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-agent"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("CommentID"); b.HasIndex("CreatedAt"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("Status"); b.HasIndex("Type"); b.HasIndex("CommentID", "ID"); b.HasIndex("CommentID", "MemberID") .IsUnique(); b.ToTable("CommentReport", null, t => { t.HasComment("댓글 신고"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CommentFileID") .HasColumnType("int") .HasComment("댓글 파일 ID"); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("CommentFileID"); b.HasIndex("CommentID"); b.HasIndex("MemberID"); b.HasIndex("CommentID", "CommentFileID"); b.HasIndex("CommentID", "CommentFileID", "MemberID"); b.ToTable("CommentFileDownLog", null, t => { t.HasComment("댓글 파일 다운로드 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("CommentLinkID") .HasColumnType("int") .HasComment("댓글 링크 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("CommentID"); b.HasIndex("CommentLinkID"); b.HasIndex("MemberID"); b.HasIndex("CommentID", "CommentLinkID"); b.HasIndex("CommentID", "CommentLinkID", "MemberID"); b.ToTable("CommentLinkClickLog", null, t => { t.HasComment("댓글 링크 클릭 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CommentID") .HasColumnType("int") .HasComment("댓글 ID"); b.Property("ContentDiff") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("변경 내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Note") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("비고"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("CommentID"); b.HasIndex("ContentDiff"); b.HasIndex("MemberID"); b.HasIndex("CommentID", "ID"); b.HasIndex("CommentID", "MemberID"); b.HasIndex("CommentID", "MemberID", "ID"); b.ToTable("CommentUpdateLog", null, t => { t.HasComment("댓글 수정 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("PostFileID") .HasColumnType("int") .HasComment("게시글 파일 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("PostFileID"); b.HasIndex("PostID"); b.HasIndex("PostID", "PostFileID"); b.HasIndex("PostID", "PostFileID", "MemberID"); b.ToTable("PostFileDownLog", null, t => { t.HasComment("게시글 파일 다운로드 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("PostLinkID") .HasColumnType("int") .HasComment("게시글 파일 ID"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("PostLinkID"); b.HasIndex("PostID", "PostLinkID"); b.HasIndex("PostID", "PostLinkID", "MemberID"); b.ToTable("PostLinkClickLog", null, t => { t.HasComment("게시글 링크 클릭 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ContentDiff") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("변경 내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Note") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("비고"); b.Property("PostID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("SubjectDiff") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("변경 제목"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.HasKey("ID"); b.HasIndex("ContentDiff"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("SubjectDiff"); b.HasIndex("PostID", "ID"); b.HasIndex("PostID", "MemberID"); b.HasIndex("PostID", "MemberID", "ID"); b.ToTable("PostUpdateLog", null, t => { t.HasComment("게시글 수정 로그"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IpAddress") .HasColumnType("nvarchar(max)"); b.Property("MemberID") .HasColumnType("int"); b.Property("PostID") .HasColumnType("int"); b.Property("UserAgent") .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.ToTable("PostViewLog"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("BoardPrefixID") .HasColumnType("int") .HasComment("게시글 말머리 ID"); b.Property("Bookmarks") .HasColumnType("int") .HasComment("즐겨찾기 수"); b.Property("Comments") .HasColumnType("int") .HasComment("댓글 수"); b.Property("Content") .IsRequired() .HasMaxLength(8000) .HasColumnType("nvarchar(max)") .HasComment("내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DeletedAt") .HasColumnType("datetime2") .HasComment("삭제 일시"); b.Property("Dislikes") .HasColumnType("int") .HasComment("싫어요"); b.Property("Email") .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("회원 이메일"); b.Property("Files") .HasColumnType("tinyint") .HasComment("파일 수"); b.Property("Images") .HasColumnType("tinyint") .HasComment("이미지 수"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP"); b.Property("IsAnonymous") .HasColumnType("bit") .HasComment("익명 글 여부"); b.Property("IsDeleted") .HasColumnType("bit") .HasComment("삭제 여부"); b.Property("IsNotice") .HasColumnType("bit") .HasComment("일반 공지 여부"); b.Property("IsReply") .HasColumnType("bit") .HasComment("답변 여부"); b.Property("IsSecret") .HasColumnType("bit") .HasComment("비밀글 여부"); b.Property("IsSpeaker") .HasColumnType("bit") .HasComment("전체 공지 여부"); b.Property("LastCommentUpdatedAt") .HasColumnType("datetime2") .HasComment("마지막 댓글 일시"); b.Property("LastReplyUpdatedAt") .HasColumnType("datetime2") .HasComment("마지막 답변 일시"); b.Property("Likes") .HasColumnType("int") .HasComment("좋아요"); b.Property("Medias") .HasColumnType("tinyint") .HasComment("미디어 수"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Name") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("회원 이름"); b.Property("Reports") .HasColumnType("int") .HasComment("신고 수"); b.Property("SID") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("회원 SID"); b.Property("StockCode") .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("종목 가상보드 파티션 코드 (stock 보드 전용)"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("제목"); b.Property("Tags") .HasColumnType("tinyint") .HasComment("Tag 수"); b.Property("Thumbnail") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("대표 이미지"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-Agent"); b.Property("Views") .HasColumnType("int") .HasComment("조회 수"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("BoardPrefixID"); b.HasIndex("MemberID"); b.HasIndex("ID", "BoardID"); b.HasIndex("StockCode", "CreatedAt") .IsDescending(false, true) .HasDatabaseName("IX_Post_StockCode_CreatedAt") .HasFilter("[StockCode] IS NOT NULL AND [IsDeleted] = 0"); b.HasIndex("ID", "BoardID", "IsDeleted"); b.HasIndex("MemberID", "IsDeleted", "CreatedAt") .IsDescending(false, false, true); b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Comments"); b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "CreatedAt"); b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Likes"); b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Views"); b.ToTable("Post", null, t => { t.HasComment("게시글"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IpAddress") .HasColumnType("nvarchar(max)"); b.Property("MemberID") .HasColumnType("int"); b.Property("PostID") .HasColumnType("int"); b.Property("UserAgent") .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("PostID", "MemberID") .IsUnique(); b.ToTable("PostBookmark", null, t => { t.HasComment("게시글 즐겨찾기"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasColumnType("int") .HasComment("총 응원 금액"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("응원 일시"); b.Property("FeeAmount") .HasColumnType("int") .HasComment("플랫폼 수수료(소각분)"); b.Property("FromMemberID") .HasColumnType("int") .HasComment("응원 발신자 회원 ID"); b.Property("Message") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("응원 한마디"); b.Property("NetAmount") .HasColumnType("int") .HasComment("작성자 수령 순액(Reward 적립)"); b.Property("PostID") .HasColumnType("int") .HasComment("응원 대상 게시글 ID"); b.Property("ToMemberID") .HasColumnType("int") .HasComment("응원 수신자(글 작성자) 회원 ID"); b.HasKey("ID"); b.HasIndex("PostID"); b.HasIndex("FromMemberID", "CreatedAt"); b.HasIndex("ToMemberID", "CreatedAt"); b.ToTable("PostCheer", null, t => { t.HasComment("분석글 응원(Cheer) — D3 M4"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("ContentType") .HasColumnType("nvarchar(max)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("Downloads") .HasColumnType("int"); b.Property("Extension") .HasColumnType("nvarchar(max)"); b.Property("FileName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("HashedName") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("Path") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("PostID") .HasColumnType("int"); b.Property("Size") .HasColumnType("bigint"); b.Property("UUID") .HasColumnType("uniqueidentifier"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("PostID"); b.HasIndex("UUID") .IsUnique(); b.ToTable("PostFile", null, t => { t.HasComment("게시글 파일"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("ContentType") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("MIME 타입"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DisabledAt") .HasColumnType("datetime2") .HasComment("비활성 일시"); b.Property("Extension") .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("확장자"); b.Property("FileName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("원본 파일명"); b.Property("HashedName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("저장 파일명"); b.Property("Height") .HasColumnType("smallint") .HasComment("세로 해상도(px)"); b.Property("IsDisabled") .HasColumnType("bit") .HasComment("비활성 여부"); b.Property("Path") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("저장 경로"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Size") .HasColumnType("bigint") .HasComment("용량(byte)"); b.Property("UUID") .HasColumnType("uniqueidentifier") .HasComment("이미지 ID"); b.Property("Url") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("URL"); b.Property("Width") .HasColumnType("smallint") .HasComment("가로 해상도(px)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("PostID"); b.HasIndex("UUID") .IsUnique(); b.HasIndex("PostID", "HashedName"); b.HasIndex("PostID", "HashedName", "IsDisabled"); b.ToTable("PostImage", null, t => { t.HasComment("게시글 이미지"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("Clicks") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("PostID") .HasColumnType("int"); b.Property("UUID") .HasColumnType("uniqueidentifier"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("PostID"); b.ToTable("PostLink", null, t => { t.HasComment("게시글 링크"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2"); b.Property("IsDisabled") .HasColumnType("bit"); b.Property("PostID") .HasColumnType("int"); b.Property("Url") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("PostID"); b.ToTable("PostMedia", null, t => { t.HasComment("게시글 미디어"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BasePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("작성 시점 기준가"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Direction") .HasColumnType("tinyint") .HasComment("예측 방향 (1=상승, 2=하락)"); b.Property("DueDate") .HasColumnType("date") .HasComment("채점 예정일"); b.Property("HorizonDays") .HasColumnType("smallint") .HasComment("예측 기간 (영업일 수)"); b.Property("MemberID") .HasColumnType("int") .HasComment("작성 회원 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID (1:1)"); b.Property("SettledAt") .HasColumnType("datetime2") .HasComment("채점 일시"); b.Property("SettledPrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("채점 시점 종가"); b.Property("Status") .HasColumnType("tinyint") .HasComment("상태 (0=Pending/1=Hit/2=Miss/3=Void)"); b.Property("StockCode") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("예측 종목 단축코드"); b.Property("TargetPrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("목표가 (선택)"); b.HasKey("ID"); b.HasIndex("PostID") .IsUnique(); b.HasIndex("MemberID", "Status"); b.HasIndex("Status", "DueDate"); b.ToTable("PostPrediction", null, t => { t.HasComment("예측글 (방향/기간 예측 + 채점)"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Reaction") .HasColumnType("tinyint") .HasComment("반응 구분"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-agent"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("Reaction"); b.HasIndex("PostID", "MemberID") .IsUnique(); b.ToTable("PostReaction", null, t => { t.HasComment("게시글 반응"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int") .HasComment("게시판 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(15) .HasColumnType("nvarchar(15)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Memo") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("처리 내용"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("Reason") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("신고 내용"); b.Property("Status") .HasColumnType("tinyint") .HasComment("처리 상태"); b.Property("Type") .HasColumnType("tinyint") .HasComment("신고 사유"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-agent"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("MemberID"); b.HasIndex("PostID"); b.HasIndex("Status"); b.HasIndex("Type"); b.HasIndex("PostID", "MemberID") .IsUnique(); b.ToTable("PostReport", null, t => { t.HasComment("게시글 신고"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("PostID") .HasColumnType("int") .HasComment("게시글 ID"); b.Property("StockCode") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("종목 단축코드"); b.HasKey("ID"); b.HasIndex("PostID", "StockCode") .IsUnique(); b.HasIndex("StockCode", "CreatedAt") .IsDescending(false, true); b.ToTable("PostStockTag", null, t => { t.HasComment("글 본문 $종목 태그 (언급량 랭킹 원천)"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BoardID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("PostID") .HasColumnType("int"); b.Property("TagID") .HasColumnType("int"); b.HasKey("ID"); b.HasIndex("BoardID"); b.HasIndex("PostID"); b.HasIndex("TagID"); b.ToTable("PostTag", null, t => { t.HasComment("게시글 태그 연결"); }); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("Name") .IsRequired() .HasColumnType("nvarchar(450)"); b.Property("Slug") .IsRequired() .HasColumnType("nvarchar(450)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("UsageCount") .HasColumnType("bigint"); b.HasKey("ID"); b.HasIndex("Name") .IsUnique(); b.HasIndex("Slug") .IsUnique(); b.HasIndex("UsageCount"); b.ToTable("Tag", null, t => { t.HasComment("태그"); }); }); modelBuilder.Entity("Domain.Entities.Members.Attendance", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ConsecutiveDays") .HasColumnType("int") .HasComment("연속 출석 일수"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("출석 일시"); b.Property("ExpRewarded") .HasColumnType("int") .HasComment("지급 경험치"); b.Property("Greeting") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("출석 인사"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("PointRewarded") .HasColumnType("int") .HasComment("지급 포인트"); b.HasKey("ID"); b.HasIndex("CreatedAt") .IsDescending(); b.HasIndex("MemberID", "CreatedAt") .IsDescending(false, true); b.ToTable("Attendance", null, t => { t.HasComment("출석 기록"); }); }); modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChannelID") .HasColumnType("int") .HasComment("채널 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("생성 일시"); b.Property("DurationSec") .HasColumnType("int") .HasComment("방송 시간 (초)"); b.Property("EndAt") .HasColumnType("datetime2") .HasComment("방송 종료 시각"); b.Property("FinalLikes") .HasColumnType("bigint") .HasComment("최종 좋아요"); b.Property("FinalViews") .HasColumnType("bigint") .HasComment("최종 조회수"); b.Property("IsFinalized") .HasColumnType("bit") .HasComment("최종 확정 여부 (End + 24h 경과)"); b.Property("Platform") .HasColumnType("int") .HasComment("플랫폼 (YouTube=1)"); b.Property("StartAt") .HasColumnType("datetime2") .HasComment("방송 시작 시각"); b.Property("Title") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("방송 제목"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("VideoID") .IsRequired() .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("플랫폼 비디오 ID"); b.HasKey("ID"); b.HasIndex("IsFinalized"); b.HasIndex("ChannelID", "EndAt") .IsDescending(false, true); b.HasIndex("Platform", "VideoID") .IsUnique(); b.ToTable("BroadcastSession", null, t => { t.HasComment("방송 세션 (라이브 1회 단위)"); }); }); modelBuilder.Entity("Domain.Entities.Members.Channel", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BannerUrl") .HasColumnType("nvarchar(max)"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Description") .HasColumnType("nvarchar(max)"); b.Property("DonationCode") .HasMaxLength(7) .HasColumnType("nvarchar(7)") .HasComment("후원 코드(4~7자 영문+숫자, 대문자). 1회성 발급, 변경 불가"); b.Property("Email") .HasColumnType("nvarchar(max)"); b.Property("Handle") .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("핸들"); b.Property("IsActive") .HasColumnType("bit") .HasComment("활성 여부"); b.Property("IsVerified") .HasColumnType("bit") .HasComment("인증 여부"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("채널 이름"); b.Property("PlatformFeeRate") .HasPrecision(10, 7) .HasColumnType("decimal(10,7)") .HasComment("후원 수수료(%) — dpot 몫, 0~100, 소수점 7자리"); b.Property("SID") .IsRequired() .HasMaxLength(24) .HasColumnType("nvarchar(24)") .HasComment("채널 ID"); b.Property("StoreCommissionRate") .ValueGeneratedOnAdd() .HasPrecision(10, 7) .HasColumnType("decimal(10,7)") .HasDefaultValue(0m) .HasComment("상점 매출 보상률(%) — 채널 몫, 0~100, 소수점 7자리"); b.Property("SubscriberCount") .HasColumnType("bigint"); b.Property("ThumbnailUrl") .HasColumnType("nvarchar(max)"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("VideoCount") .HasColumnType("bigint"); b.Property("ViewCount") .HasColumnType("bigint"); b.Property("WidgetToken") .IsRequired() .HasMaxLength(32) .HasColumnType("nvarchar(32)") .HasComment("위젯 토큰"); b.Property("YouTubeChannelID") .HasColumnType("nvarchar(max)"); b.Property("YouTubeLastSyncedAt") .HasColumnType("datetime2") .HasComment("YouTube API 마지막 동기화 시각(UTC) — 30일 정책 enforcement"); b.Property("YouTubePublishedAt") .HasColumnType("datetime2"); b.Property("YouTubeUrl") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("YouTube 채널 URL"); b.HasKey("ID"); b.HasIndex("DonationCode") .IsUnique() .HasFilter("[DonationCode] IS NOT NULL"); b.HasIndex("Handle") .IsUnique() .HasFilter("[Handle] IS NOT NULL"); b.HasIndex("MemberID") .IsUnique(); b.HasIndex("Name") .IsUnique(); b.HasIndex("SID") .IsUnique(); b.HasIndex("WidgetToken") .IsUnique(); b.HasIndex("YouTubeLastSyncedAt"); b.HasIndex("YouTubeUrl") .IsUnique(); b.HasIndex("MemberID", "IsActive"); b.HasIndex("MemberID", "IsVerified"); b.HasIndex("MemberID", "IsVerified", "IsActive"); b.ToTable("Channel", null, t => { t.HasComment("채널 정보"); }); }); modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b => { b.Property("ChannelID") .HasColumnType("int") .HasComment("채널 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("생성 일시"); b.Property("CumulativeViews") .HasColumnType("bigint") .HasComment("누적 조회수"); b.Property("LastAggregatedAt") .HasColumnType("datetime2") .HasComment("마지막 집계 일시"); b.Property("LastBroadcastAt") .HasColumnType("datetime2") .HasComment("마지막 방송 일시"); b.Property("SessionCount") .HasColumnType("int") .HasComment("방송 횟수"); b.Property("TotalDurationSec") .HasColumnType("bigint") .HasComment("누적 방송 시간 (초)"); b.Property("TotalLikes") .HasColumnType("bigint") .HasComment("누적 좋아요"); b.HasKey("ChannelID"); b.ToTable("ChannelBroadcastStats", null, t => { t.HasComment("채널별 누적 방송 지표"); }); }); modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangedAt") .HasColumnType("datetime2") .HasComment("변경 일시"); b.Property("ChannelID") .HasColumnType("int") .HasComment("채널 ID"); b.Property("OldHandle") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("이전 핸들"); b.HasKey("ID"); b.HasIndex("OldHandle"); b.HasIndex("ChannelID", "ChangedAt") .IsDescending(false, true); b.ToTable("ChannelHandleHistory", null, t => { t.HasComment("채널 핸들 변경 이력"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AfterEmail") .IsRequired() .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("바뀐 이메일"); b.Property("BeforeEmail") .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("이전 이메일"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("MemberID"); b.ToTable("MemberEmailChangeLog", null, t => { t.HasComment("사용자 이메일 변경 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasColumnType("int") .HasComment("변동량"); b.Property("Balance") .HasColumnType("bigint") .HasComment("잔액"); b.Property("BroadcastSessionID") .HasColumnType("int") .HasComment("방송 세션 ID (리더보드 집계 대상)"); b.Property("ChannelID") .HasColumnType("int") .HasComment("채널 ID (channel 단위 조회용)"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("기록 일시"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Reason") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("사유"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("BroadcastSessionID", "MemberID"); b.HasIndex("ChannelID", "MemberID", "CreatedAt"); b.ToTable("MemberExpLog", null, t => { t.HasComment("경험치 변동 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AfterIntro") .HasMaxLength(3000) .HasColumnType("nvarchar(3000)") .HasComment("바꾼 자기소개"); b.Property("BeforeIntro") .HasMaxLength(3000) .HasColumnType("nvarchar(3000)") .HasComment("이전 자기소개"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address (IPv6 호환)"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.ToTable("MemberIntroChangeLog", null, t => { t.HasComment("자기소개 변경 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberItemUsageLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Action") .HasColumnType("tinyint") .HasComment("액션 (1=Used, 2=Revoked)"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Detail") .HasMaxLength(300) .HasColumnType("nvarchar(300)") .HasComment("결과 요약"); b.Property("Kind") .HasColumnType("tinyint") .HasComment("아이템 종류"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("MemberItemID") .HasColumnType("int") .HasComment("MemberItem ID"); b.Property("ProductID") .HasColumnType("int") .HasComment("상품 ID"); b.HasKey("ID"); b.HasIndex("MemberID", "CreatedAt"); b.ToTable("MemberItemUsageLog", null, t => { t.HasComment("소모품 아이템 사용/회수 로그"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Account") .IsRequired() .HasMaxLength(120) .HasColumnType("nvarchar(120)") .HasComment("로그인 시도한 계정"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Reason") .HasMaxLength(225) .HasColumnType("nvarchar(225)") .HasComment("실패 이유"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("Success") .HasColumnType("bit") .HasComment("로그인 성공 여부 (0: 실패, 1: 성공)"); b.Property("Url") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("요청 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("Account"); b.HasIndex("MemberID"); b.HasIndex("MemberID", "Success"); b.ToTable("MemberLoginLog", null, t => { t.HasComment("로그인 기록"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AfterName") .HasMaxLength(40) .HasColumnType("nvarchar(40)") .HasComment("바꾼 별명"); b.Property("BeforeName") .HasMaxLength(40) .HasColumnType("nvarchar(40)") .HasComment("이전 별명"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address (IPv6 호환)"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.ToTable("MemberNameChangeLog", null, t => { t.HasComment("별명 변경 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AfterSummary") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("바꾼 한마디"); b.Property("BeforeSummary") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("이전 한마디"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address (IPv6 호환)"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.ToTable("MemberSummaryChangeLog", null, t => { t.HasComment("한마디 변경 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AfterThumb") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("바꾼 이미지"); b.Property("BeforeThumb") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("이전 이미지"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address (IPv6 호환)"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("Referer") .HasColumnType("nvarchar(max)") .HasComment("이전 페이지 주소"); b.Property("UserAgent") .HasMaxLength(512) .HasColumnType("nvarchar(512)") .HasComment("User Agent"); b.HasKey("ID"); b.HasIndex("MemberID"); b.ToTable("MemberThumbChangeLog", null, t => { t.HasComment("프로필 이미지 변경 내역"); }); }); modelBuilder.Entity("Domain.Entities.Members.Member", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AuthCertifiedAt") .HasColumnType("datetime2") .HasComment("본인인증 일시"); b.Property("BannerUrl") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("배너 이미지"); b.Property("Birthday") .HasColumnType("date") .HasComment("생년월일"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("가입 일시"); b.Property("DeletedAt") .HasColumnType("datetime2") .HasComment("탈퇴 일시"); b.Property("DeniedAt") .HasColumnType("datetime2") .HasComment("차단 일시"); b.Property("DeviceInfo") .HasMaxLength(400) .HasColumnType("nvarchar(400)") .HasComment("로그인 단말기 정보"); b.Property("Email") .IsRequired() .HasMaxLength(60) .HasColumnType("nvarchar(60)") .HasComment("이메일"); b.Property("EmailVerifiedAt") .HasColumnType("datetime2") .HasComment("이메일 인증 일시"); b.Property("FirstName") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("본명(성)"); b.Property("FullName") .HasMaxLength(40) .HasColumnType("nvarchar(40)") .HasComment("본명"); b.Property("Gender") .HasColumnType("int") .HasComment("성별"); b.Property("Icon") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("아이콘"); b.Property("Intro") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("자기소개"); b.Property("IpAddress") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("IP Address"); b.Property("IsAdmin") .HasColumnType("bit") .HasComment("운영진 여부"); b.Property("IsAuthCertified") .HasColumnType("bit") .HasComment("본인 인증 여부"); b.Property("IsCreator") .HasColumnType("bit") .HasComment("크리에이터 여부"); b.Property("IsDenied") .HasColumnType("bit") .HasComment("차단 여부"); b.Property("IsEmailVerified") .HasColumnType("bit") .HasComment("이메일 인증 여부"); b.Property("IsWithdraw") .HasColumnType("bit") .HasComment("탈퇴 여부"); b.Property("LastEmailChangedAt") .HasColumnType("datetime2") .HasComment("마지막 이메일 변경 일시"); b.Property("LastIntroChangedAt") .HasColumnType("datetime2") .HasComment("마지막 자기소개 변경 일시"); b.Property("LastLoginAt") .HasColumnType("datetime2") .HasComment("마지막 로그인 일시"); b.Property("LastLoginIp") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("마지막 로그인 IP (IPv6 호환 — 최대 45 char)"); b.Property("LastName") .HasMaxLength(40) .HasColumnType("nvarchar(40)") .HasComment("본명(이름)"); b.Property("LastNameChangedAt") .HasColumnType("datetime2") .HasComment("마지막 별명 변경 일시"); b.Property("LastSummaryChangedAt") .HasColumnType("datetime2") .HasComment("마지막 한마디 변경 일시"); b.Property("LastThumbChangedAt") .HasColumnType("datetime2"); b.Property("MemberGradeID") .HasColumnType("int") .HasComment("회원등급 PK"); b.Property("Name") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("별명"); b.Property("Password") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("비밀번호"); b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); b.Property("PasswordUpdatedAt") .HasColumnType("datetime2") .HasComment("비밀번호 변경 일시"); b.Property("PaymentCustomerKey") .HasColumnType("uniqueidentifier"); b.Property("Phone") .HasMaxLength(15) .HasColumnType("nvarchar(15)") .HasComment("연락처"); b.Property("SID") .IsRequired() .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("SID"); b.Property("SignupIP") .HasMaxLength(45) .HasColumnType("nvarchar(45)") .HasComment("회원가입 시 IP (IPv6 호환 — 최대 45 char)"); b.Property("Summary") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasComment("한마디"); b.Property("Thumb") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("썸네일"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("UserAgent") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("User-agent"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("DeletedAt"); b.HasIndex("Email") .IsUnique(); b.HasIndex("FullName"); b.HasIndex("Gender"); b.HasIndex("IsAdmin"); b.HasIndex("IsAuthCertified"); b.HasIndex("IsCreator"); b.HasIndex("IsDenied"); b.HasIndex("IsEmailVerified"); b.HasIndex("IsWithdraw"); b.HasIndex("MemberGradeID"); b.HasIndex("Name") .IsUnique() .HasFilter("[Name] IS NOT NULL"); b.HasIndex("Phone"); b.HasIndex("SID") .IsUnique(); b.ToTable("Member", null, t => { t.HasComment("회원 정보"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b => { b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("DisclosureInvestConsentAt") .HasColumnType("datetime2") .HasComment("투자 현황 공개 동의 일시"); b.Property("DonationPublicConsentAt") .HasColumnType("datetime2"); b.Property("IsDisclosureInvest") .HasColumnType("bit") .HasComment("투자 현황 공개 여부"); b.Property("IsDonationPublic") .HasColumnType("bit"); b.Property("IsRankingPublic") .HasColumnType("bit") .HasComment("랭킹 공개 여부"); b.Property("IsReceiveEmail") .HasColumnType("bit") .HasComment("E-MAIL 수신 여부"); b.Property("IsReceiveNote") .HasColumnType("bit") .HasComment("쪽지 수신 여부"); b.Property("IsReceiveSMS") .HasColumnType("bit") .HasComment("SMS 수신 여부"); b.Property("RankingPublicConsentAt") .HasColumnType("datetime2") .HasComment("랭킹 공개 동의 일시"); b.Property("ReceiveEmailConsentAt") .HasColumnType("datetime2") .HasComment("E-MAIL 수신 동의 일시"); b.Property("ReceiveNoteConsentAt") .HasColumnType("datetime2") .HasComment("쪽지 수신 동의 일시"); b.Property("ReceiveSMSConsentAt") .HasColumnType("datetime2") .HasComment("SMS 수신 동의 일시"); b.HasKey("MemberID"); b.ToTable("MemberApprove", null, t => { t.HasComment("회원 알림 및 수신 동의"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b => { b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("RewardDate") .HasColumnType("date") .HasComment("KST 기준 일자"); b.Property("ActionType") .HasColumnType("tinyint") .HasComment("액션 유형 (Post=1..PaperReward=8)"); b.Property("Count") .HasColumnType("int") .HasComment("오늘 지급 횟수"); b.Property("ExpTotal") .HasColumnType("int") .HasComment("오늘 지급 경험치 합계"); b.Property("PointTotal") .HasColumnType("int") .HasComment("오늘 지급 토큰 합계"); b.HasKey("MemberID", "RewardDate", "ActionType"); b.HasIndex("RewardDate"); b.ToTable("MemberDailyRewardCounter", null, t => { t.HasComment("일일 보상 캡 원장 (d3 M2)"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("팔로우 일시"); b.Property("FolloweeMemberID") .HasColumnType("int") .HasComment("팔로우 대상 회원 ID"); b.Property("FollowerMemberID") .HasColumnType("int") .HasComment("팔로우 주체 회원 ID"); b.Property("IsMuted") .HasColumnType("bit") .HasComment("피드 숨김 여부"); b.Property("NotifyOnPost") .HasColumnType("bit") .HasComment("새 글 알림 수신 여부"); b.HasKey("ID"); b.HasIndex("FolloweeMemberID"); b.HasIndex("FollowerMemberID", "CreatedAt") .IsDescending(false, true); b.HasIndex("FollowerMemberID", "FolloweeMemberID") .IsUnique(); b.ToTable("MemberFollow", null, t => { t.HasComment("회원 팔로우 관계"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberGrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("Description") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("설명"); b.Property("EngName") .IsRequired() .HasMaxLength(120) .HasColumnType("nvarchar(120)") .HasComment("영문 명"); b.Property("Image") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("이미지"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("KorName") .IsRequired() .HasMaxLength(240) .HasColumnType("nvarchar(240)") .HasComment("한글 명"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("RequiredAttendance") .HasColumnType("bigint") .HasComment("누적 출석 수"); b.Property("RequiredExp") .HasColumnType("int") .HasComment("누적 경험치"); b.Property("TextColor") .HasMaxLength(7) .HasColumnType("nvarchar(7)") .HasComment("표시 색상"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("EngName") .IsUnique(); b.HasIndex("IsActive"); b.HasIndex("KorName") .IsUnique(); b.HasIndex("Order"); b.HasIndex("Order", "IsActive"); b.ToTable("MemberGrade", null, t => { t.HasComment("회원 등급"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberItem", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AcquiredAt") .HasColumnType("datetime2") .HasComment("획득 일시"); b.Property("DurationDays") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(0) .HasComment("효과 지속일 (0=즉시소모/영구)"); b.Property("EquipSlot") .HasColumnType("tinyint") .HasComment("장착 슬롯 (1=Badge, 2=NicknameEffect, 3=CommentEffect, null=소모품)"); b.Property("ExpiresAt") .HasColumnType("datetime2") .HasComment("만료 일시 (null=영구)"); b.Property("GiftFromMemberID") .HasColumnType("int") .HasComment("선물 발신자 회원 ID (null=본인구매)"); b.Property("IsEquipped") .ValueGeneratedOnAdd() .HasColumnType("bit") .HasDefaultValue(false) .HasComment("장착 여부 (지위 아이템)"); b.Property("Kind") .HasColumnType("tinyint") .HasComment("아이템 종류 (2~4=지위, 5~11=소모품)"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID (지급 대상)"); b.Property("OrderItemID") .HasColumnType("int") .HasComment("발급 근거 주문항목 ID"); b.Property("ProductID") .HasColumnType("int") .HasComment("상품 ID"); b.Property("RevokedAt") .HasColumnType("datetime2") .HasComment("회수 일시 (환불)"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("UsedAt") .HasColumnType("datetime2") .HasComment("소모/활성 일시 (null=미사용)"); b.HasKey("ID"); b.HasIndex("OrderItemID"); b.HasIndex("ProductID"); b.HasIndex("MemberID", "EquipSlot") .IsUnique() .HasFilter("[IsEquipped] = 1"); b.HasIndex("MemberID", "ExpiresAt"); b.HasIndex("MemberID", "Kind", "UsedAt"); b.ToTable("MemberItem", null, t => { t.HasComment("계정 귀속 아이템 (지위 아이템 장착형 + 소모품)"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AccessTokenEnc") .IsRequired() .HasMaxLength(2048) .HasColumnType("nvarchar(2048)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ExpiresAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int"); b.Property("Provider") .IsRequired() .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("ProviderUserKey") .HasMaxLength(128) .HasColumnType("nvarchar(128)"); b.Property("RefreshTokenEnc") .HasMaxLength(2048) .HasColumnType("nvarchar(2048)"); b.Property("Scopes") .IsRequired() .HasMaxLength(1024) .HasColumnType("nvarchar(1024)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("MemberID", "Provider") .IsUnique(); b.HasIndex("Provider", "ProviderUserKey"); b.ToTable("MemberOAuthToken", null, t => { t.HasComment("회원 OAuth 토큰"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberStats", b => { b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("AttendanceCount") .HasColumnType("bigint") .HasComment("출석"); b.Property("BookmarkGivenCount") .HasColumnType("bigint") .HasComment("즐겨찾기 글 수"); b.Property("CommentCount") .HasColumnType("bigint") .HasComment("작성 댓글"); b.Property("Exp") .HasColumnType("bigint") .HasComment("경험치"); b.Property("FollowerCount") .HasColumnType("bigint") .HasComment("구독자"); b.Property("FollowingCount") .HasColumnType("bigint") .HasComment("구독 중"); b.Property("LikeGivenCount") .HasColumnType("bigint") .HasComment("누른 좋아요 수"); b.Property("LikeReceivedCount") .HasColumnType("bigint") .HasComment("받은 좋아요 수"); b.Property("LoginCount") .HasColumnType("bigint") .HasComment("로그인"); b.Property("PaymentCount") .HasColumnType("bigint") .HasComment("결제 횟수"); b.Property("PostCount") .HasColumnType("bigint") .HasComment("작성 게시글"); b.Property("ReportedCount") .HasColumnType("bigint") .HasComment("신고 당한 횟수"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion") .HasComment("동시성"); b.Property("SuspensionCount") .HasColumnType("int") .HasComment("정지 횟수"); b.Property("TotalCanceledAmount") .HasColumnType("bigint") .HasComment("누적 취소/환불 금액"); b.Property("TotalPaidAmount") .HasColumnType("bigint") .HasComment("누적 결제 금액"); b.Property("WarningCount") .HasColumnType("int") .HasComment("경고 횟수"); b.HasKey("MemberID"); b.ToTable("MemberStats", null, t => { t.HasComment("회원 활동 집계"); }); }); modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b => { b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID (PK)"); b.Property("BestStreak") .HasColumnType("int") .HasComment("역대 최고 연속 적중"); b.Property("CurrentStreak") .HasColumnType("int") .HasComment("현재 연속 적중"); b.Property("HitRate") .HasPrecision(5, 2) .HasColumnType("decimal(5,2)") .HasComment("적중률 % (Hits/(Hits+Misses)*100)"); b.Property("Hits") .HasColumnType("int") .HasComment("적중 수"); b.Property("Misses") .HasColumnType("int") .HasComment("실패 수"); b.Property("Predictions") .HasColumnType("int") .HasComment("채점 완료 예측 총계 (Hits+Misses+Voids)"); b.Property("Tier") .HasColumnType("tinyint") .HasComment("배지 등급 (0=None/1=Bronze/2=Silver/3=Gold/4=GoldAnt)"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("갱신 일시"); b.Property("Voids") .HasColumnType("int") .HasComment("무효 수 (표본 제외)"); b.HasKey("MemberID"); b.HasIndex("HitRate") .IsDescending() .HasDatabaseName("IX_MemberTrackRecord_HitRate") .HasFilter("[Predictions] >= 10"); b.ToTable("MemberTrackRecord", null, t => { t.HasComment("회원 예측 트랙레코드 집계 (적중률 배지·리더보드)"); }); }); modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ExpiresAt") .HasColumnType("datetime2"); b.Property("IsRevoked") .ValueGeneratedOnAdd() .HasColumnType("bit") .HasDefaultValue(false); b.Property("MemberID") .HasColumnType("int"); b.Property("ReplacedByToken") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("RevokedAt") .HasColumnType("datetime2"); b.Property("Token") .IsRequired() .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("Token") .IsUnique(); b.ToTable("RefreshToken", null, t => { t.HasComment("리프레시 토큰"); }); }); modelBuilder.Entity("Domain.Entities.Notes.Note", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Content") .IsRequired() .HasMaxLength(2000) .HasColumnType("nvarchar(2000)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IsDeletedByReceiver") .HasColumnType("bit"); b.Property("IsDeletedBySender") .HasColumnType("bit"); b.Property("IsRead") .HasColumnType("bit"); b.Property("IsSystem") .HasColumnType("bit"); b.Property("ReadAt") .HasColumnType("datetime2"); b.Property("ReceiverMemberID") .HasColumnType("int"); b.Property("RelatedID") .HasColumnType("int"); b.Property("RelatedType") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("SenderMemberID") .HasColumnType("int"); b.Property("Title") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.HasKey("ID"); b.HasIndex("SenderMemberID", "IsDeletedBySender", "CreatedAt") .IsDescending(false, false, true); b.HasIndex("ReceiverMemberID", "IsDeletedByReceiver", "IsRead", "CreatedAt") .IsDescending(false, false, false, true); b.ToTable("Note", null, t => { t.HasComment("쪽지"); }); }); modelBuilder.Entity("Domain.Entities.Notifications.Notification", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ActionUrl") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ImageUrl") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("IsRead") .HasColumnType("bit"); b.Property("MemberID") .HasColumnType("int"); b.Property("Message") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("ReadAt") .HasColumnType("datetime2"); b.Property("RelatedID") .HasColumnType("int"); b.Property("RelatedType") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("Title") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("Type") .HasColumnType("int"); b.HasKey("ID"); b.HasIndex("MemberID", "IsRead", "CreatedAt") .IsDescending(false, false, true); b.HasIndex("MemberID", "Type", "CreatedAt") .IsDescending(false, false, true); b.ToTable("Notification", null, t => { t.HasComment("알림"); }); }); modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("DesktopImage") .HasMaxLength(1024) .HasColumnType("nvarchar(1024)") .HasComment("이미지(Desktop)"); b.Property("EndAt") .HasColumnType("datetime2") .HasComment("사용 기간 - 종료"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Link") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("주소"); b.Property("LinkTarget") .IsRequired() .ValueGeneratedOnAdd() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasDefaultValue("_self") .HasComment("링크 타겟 (_self/_blank)"); b.Property("MobileImage") .HasMaxLength(1024) .HasColumnType("nvarchar(1024)") .HasComment("이미지(Mobile)"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("PositionID") .HasColumnType("int") .HasComment("배너 위치 ID"); b.Property("StartAt") .HasColumnType("datetime2") .HasComment("사용 기간 - 시작"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("배너 명"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("IsActive"); b.HasIndex("Order"); b.HasIndex("PositionID"); b.HasIndex("PositionID", "Order", "IsActive"); b.ToTable("BannerItem", null, t => { t.HasComment("배너 아이템"); }); }); modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("위치 구분"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("위치 명"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("IsActive"); b.HasIndex("Code", "IsActive"); b.ToTable("BannerPosition", null, t => { t.HasComment("배너 위치"); }); }); modelBuilder.Entity("Domain.Entities.Page.Document", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("주소"); b.Property("Content") .HasMaxLength(5000) .HasColumnType("nvarchar(max)") .HasComment("내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Subject") .IsRequired() .HasMaxLength(120) .HasColumnType("nvarchar(120)") .HasComment("제목"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.Property("Views") .HasColumnType("int") .HasComment("조회 수"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("IsActive"); b.HasIndex("Subject"); b.HasIndex("Code", "IsActive"); b.ToTable("Document", null, t => { t.HasComment("문서"); }); }); modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("주소"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("분류 명"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("Order", "IsActive"); b.HasIndex("Code", "Order", "IsActive"); b.ToTable("FaqCategory", null, t => { t.HasComment("FAQ 분류"); }); }); modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Answer") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("답변"); b.Property("CategoryID") .HasColumnType("int") .HasComment("분류 ID"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("Question") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("질문"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("CategoryID"); b.HasIndex("IsActive"); b.HasIndex("Order"); b.HasIndex("Order", "IsActive"); b.HasIndex("CategoryID", "Order", "IsActive"); b.ToTable("FaqItem", null, t => { t.HasComment("FAQ 목록"); }); }); modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Content") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") .HasComment("내용"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("EndAt") .HasColumnType("datetime2") .HasComment("사용 기간 - 종료"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Link") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("주소"); b.Property("Order") .HasColumnType("smallint") .HasComment("순서"); b.Property("PositionID") .HasColumnType("int") .HasComment("팝업 위치 ID"); b.Property("StartAt") .HasColumnType("datetime2") .HasComment("사용 기간 - 시작"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("제목"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("Order"); b.HasIndex("PositionID"); b.HasIndex("Order", "IsActive"); b.HasIndex("StartAt", "EndAt", "Order", "IsActive"); b.ToTable("Popup", null, t => { t.HasComment("팝업"); }); }); modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("위치 구분"); b.Property("CreatedAt") .HasColumnType("datetime2") .HasComment("등록 일시"); b.Property("IsActive") .HasColumnType("bit") .HasComment("사용 여부"); b.Property("Subject") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("위치 명"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("수정 일시"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("IsActive"); b.HasIndex("Code", "IsActive"); b.ToTable("PopupPosition", null, t => { t.HasComment("팝업 위치"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int") .HasComment("회원 ID"); b.Property("ReservedToken") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("매수 예약 토큰"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("Token") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("자유 현금 토큰"); b.Property("TotalDeposited") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("누적 입금"); b.Property("TotalWithdrawn") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("누적 출금"); b.Property("Units") .HasPrecision(18, 8) .HasColumnType("decimal(18,8)") .HasComment("좌수"); b.HasKey("ID"); b.HasIndex("MemberID") .IsUnique(); b.ToTable("PaperAccount", null, t => { t.HasComment("모의투자 계좌 (회원당 1개)"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AccountID") .HasColumnType("int") .HasComment("계좌 ID"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("CumReturnBp") .HasColumnType("int") .HasComment("누적 수익률 Bp"); b.Property("DailyReturnBp") .HasColumnType("int") .HasComment("일간 수익률 Bp"); b.Property("Equity") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("순자산"); b.Property("FillCountCum") .HasColumnType("int") .HasComment("누적 체결 수"); b.Property("MddBp") .HasColumnType("int") .HasComment("최대 낙폭 Bp"); b.Property("PeakEquity") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("최고 순자산"); b.Property("PositionsValue") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("포지션 평가액"); b.Property("Token") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("자유+예약 토큰"); b.Property("TradeDate") .HasColumnType("date") .HasComment("거래일"); b.Property("UnitNav") .HasPrecision(18, 8) .HasColumnType("decimal(18,8)") .HasComment("좌당 순자산"); b.HasKey("ID"); b.HasIndex("AccountID", "TradeDate") .IsUnique(); b.HasIndex("TradeDate", "CumReturnBp") .IsDescending(false, true); b.ToTable("PaperDailySnapshot", null, t => { t.HasComment("모의투자 계좌 일별 스냅샷 (좌수 NAV·수익률·MDD)"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("체결 총액"); b.Property("Fee") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("수수료"); b.Property("FilledAt") .HasColumnType("datetime2"); b.Property("OrderID") .HasColumnType("int") .HasComment("주문 ID"); b.Property("Price") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("체결가"); b.Property("PriceDate") .HasColumnType("date") .HasComment("체결가 기준일"); b.Property("Quantity") .HasColumnType("int") .HasComment("수량"); b.Property("RealizedPnL") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("매도 확정 손익"); b.Property("Tax") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("거래세"); b.HasKey("ID"); b.HasIndex("OrderID") .IsUnique(); b.ToTable("PaperFill", null, t => { t.HasComment("모의투자 체결 결과 (주문당 1건, 멱등)"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AccountID") .HasColumnType("int") .HasComment("계좌 ID"); b.Property("BalanceAfter") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("이동 후 자유 토큰 잔액"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("TokenAmount") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("이동 토큰"); b.Property("Type") .HasColumnType("tinyint") .HasComment("유형 (1=입금, 2=출금)"); b.Property("UnitsDelta") .HasPrecision(18, 8) .HasColumnType("decimal(18,8)") .HasComment("좌수 변화"); b.Property("WalletTxRefID") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("연결 지갑 거래 RefID"); b.HasKey("ID"); b.HasIndex("AccountID", "CreatedAt") .IsDescending(false, true); b.ToTable("PaperLedger", null, t => { t.HasComment("모의투자 입출금 감사 원장"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AccountID") .HasColumnType("int") .HasComment("계좌 ID"); b.Property("CancelableUntil") .HasColumnType("datetime2") .HasComment("취소 가능 시한"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FillRule") .HasColumnType("tinyint") .HasComment("체결 규칙 (1=시가, 2=종가)"); b.Property("Quantity") .HasColumnType("int") .HasComment("수량"); b.Property("RejectReason") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("거부 사유"); b.Property("ReservedAmount") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasComment("매수 예약금"); b.Property("Side") .HasColumnType("tinyint") .HasComment("방향 (1=매수, 2=매도)"); b.Property("Status") .HasColumnType("tinyint") .HasComment("상태 (1=대기, 2=체결, 3=취소, 4=거부)"); b.Property("StockCode") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("단축코드"); b.Property("TargetDate") .HasColumnType("date") .HasComment("체결 기준일"); b.HasKey("ID"); b.HasIndex("AccountID", "CreatedAt") .IsDescending(false, true); b.HasIndex("Status", "TargetDate"); b.ToTable("PaperOrder", null, t => { t.HasComment("모의투자 주문"); }); }); modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AccountID") .HasColumnType("int") .HasComment("계좌 ID"); b.Property("AvgPrice") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("평균 단가"); b.Property("Quantity") .HasColumnType("int") .HasComment("보유 수량"); b.Property("ReservedQuantity") .HasColumnType("int") .HasComment("매도 예약 수량"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("StockCode") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("단축코드"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("AccountID", "StockCode") .IsUnique(); b.ToTable("PaperPosition", null, t => { t.HasComment("모의투자 보유 포지션"); }); }); modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasColumnType("int"); b.Property("CancelledAt") .HasColumnType("datetime2"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FailReason") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("MemberID") .HasColumnType("int"); b.Property("MerchantID") .IsRequired() .HasMaxLength(20) .HasColumnType("nvarchar(20)"); b.Property("OrderID") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("OrderName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)"); b.Property("PaidAt") .HasColumnType("datetime2"); b.Property("PaymentMethod") .HasColumnType("int"); b.Property("PointAmount") .HasColumnType("int"); b.Property("Status") .HasColumnType("int"); b.Property("TransactionID") .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("VatAmount") .HasColumnType("int"); b.Property("VirtualAccountBank") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("VirtualAccountExpireAt") .HasColumnType("datetime2"); b.Property("VirtualAccountHolder") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("VirtualAccountNumber") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("OrderID") .IsUnique(); b.HasIndex("Status"); b.HasIndex("TransactionID"); b.ToTable("PaymentOrder", null, t => { t.HasComment("PG 결제 주문"); }); }); modelBuilder.Entity("Domain.Entities.Payments.PaymentReconcileLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("Kind") .HasColumnType("int"); b.Property("PaymentOrderID") .HasColumnType("int"); b.Property("Reason") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)"); b.Property("TransactionID") .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("PaymentOrderID"); b.ToTable("PaymentReconcileLog", null, t => { t.HasComment("PG 성공 후 저장 실패 대사 로그 (Phase 1.5)"); }); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CancelAmount") .HasColumnType("int"); b.Property("CancelReason") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("CancelRequester") .HasMaxLength(20) .HasColumnType("nvarchar(20)"); b.Property("CanceledAt") .HasColumnType("datetime2"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int"); b.Property("OrderID") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("PaymentKey") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("PaymentOrderID") .HasColumnType("int"); b.Property("RawResponse") .HasColumnType("nvarchar(max)"); b.Property("ResponseCode") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("ResponseMessage") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("Status") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("TransactionKey") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("OrderID"); b.HasIndex("PaymentKey"); b.HasIndex("PaymentOrderID"); b.HasIndex("TransactionKey"); b.ToTable("TossCancel", null, t => { t.HasComment("토스페이먼츠 결제 취소 (요청+응답)"); }); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Amount") .HasColumnType("int"); b.Property("ApprovedAt") .HasColumnType("datetime2"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int"); b.Property("Method") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("OrderID") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("PaymentKey") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("PaymentOrderID") .HasColumnType("int"); b.Property("RawResponse") .HasColumnType("nvarchar(max)"); b.Property("ReceiptUrl") .HasMaxLength(300) .HasColumnType("nvarchar(300)"); b.Property("ResponseCode") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("ResponseMessage") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("Status") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); b.Property("TotalAmount") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("MemberID"); b.HasIndex("OrderID") .IsUnique(); b.HasIndex("PaymentKey") .IsUnique(); b.HasIndex("PaymentOrderID"); b.HasIndex("Status"); b.ToTable("TossConfirm", null, t => { t.HasComment("토스페이먼츠 결제 승인 (요청+응답)"); }); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ExtraData") .HasMaxLength(4000) .HasColumnType("nvarchar(4000)"); b.Property("LogType") .HasColumnType("int"); b.Property("MemberID") .HasColumnType("int"); b.Property("Message") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("OrderID") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.Property("PaymentKey") .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.HasKey("ID"); b.HasIndex("Code"); b.HasIndex("LogType"); b.HasIndex("MemberID"); b.HasIndex("OrderID"); b.HasIndex("PaymentKey"); b.ToTable("TossLog", null, t => { t.HasComment("토스페이먼츠 결제 에러/실패/웹훅/대사 로그"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.BondDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BondMarket") .HasColumnType("tinyint") .HasComment("채권 시장 구분 (1=국채전문유통, 2=일반채권, 3=소액채권)"); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비 (CMPPREVDD_PRC)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가 가격 (CLSPRC)"); b.Property("Code") .IsRequired() .HasMaxLength(12) .HasColumnType("nvarchar(12)") .HasComment("단축코드 (ISU_CD) — 12자리 ISIN"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가 가격 (HGPRC)"); b.Property("HighYield") .HasPrecision(9, 3) .HasColumnType("decimal(9,3)") .HasComment("고가 수익률 % (HGPRC_YD)"); b.Property("IssueType") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("종목구분 (국채전문, GOVBND_ISU_TP_NM)"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가 가격 (LWPRC)"); b.Property("LowYield") .HasPrecision(9, 3) .HasColumnType("decimal(9,3)") .HasComment("저가 수익률 % (LWPRC_YD)"); b.Property("MaturityYears") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("만기년수 (국채전문, BND_EXP_TP_NM)"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가 가격 (OPNPRC)"); b.Property("OpenYield") .HasPrecision(9, 3) .HasColumnType("decimal(9,3)") .HasComment("시가 수익률 % (OPNPRC_YD)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (ACC_TRDVAL, 원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량 (ACC_TRDVOL)"); b.Property("YieldToMaturity") .HasPrecision(9, 3) .HasColumnType("decimal(9,3)") .HasComment("만기수익률 % (CLSPRC_YD)"); b.HasKey("ID"); b.HasIndex("BondMarket", "Code", "TradeDate") .IsUnique(); b.HasIndex("BondMarket", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("BondDailyTrade", null, t => { t.HasComment("채권(국채전문유통/일반채권/소액채권) 일별매매 시세 (KRX OpenAPI bon)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.BondIndexDailyPrice", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AvgConvexity") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("평균 컨벡시티 (AVG_CONVEXITY_PRC)"); b.Property("AvgDuration") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("평균 듀레이션 (AVG_DURATION)"); b.Property("AvgYield") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("평균 만기수익률 YTM (BND_IDX_AVG_YD)"); b.Property("CallReinvestChange") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("Call재투자지수 전일 대비"); b.Property("CallReinvestIndex") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("Call재투자지수 (CALL_REINVST_IDX)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("GroupName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("채권지수 그룹명 (BND_IDX_GRP_NM)"); b.Property("MarketPriceChange") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("시장가격지수 전일 대비"); b.Property("MarketPriceIndex") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("시장가격지수 (MKT_PRC_IDX)"); b.Property("NetPriceChange") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("순가격지수 전일 대비"); b.Property("NetPriceIndex") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("순가격지수 (NETPRC_IDX)"); b.Property("TotalEarningChange") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("총수익지수 전일 대비"); b.Property("TotalEarningIndex") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("총수익지수 (TOT_EARNG_IDX)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("ZeroReinvestChange") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("제로재투자지수 전일 대비"); b.Property("ZeroReinvestIndex") .HasPrecision(18, 4) .HasColumnType("decimal(18,4)") .HasComment("제로재투자지수 (ZERO_REINVST_IDX)"); b.HasKey("ID"); b.HasIndex("TradeDate"); b.HasIndex("GroupName", "TradeDate") .IsUnique(); b.ToTable("BondIndexDailyPrice", null, t => { t.HasComment("채권지수 일별시세 (KRX OpenAPI idx/bon_dd_trd)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.CommodityDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비 (CMPPREVDD_PRC) — 금/배출권만"); b.Property("ChangeRate") .HasPrecision(9, 2) .HasColumnType("decimal(9,2)") .HasComment("등락률 % (FLUC_RT) — 금/배출권만"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가 (TDD_CLSPRC) — 석유는 가중평균가격_경쟁"); b.Property("Code") .IsRequired() .HasMaxLength(40) .HasColumnType("nvarchar(40)") .HasComment("단축코드 (ISU_CD) — 석유는 OIL_NM(유종구분)"); b.Property("CommodityMarket") .HasColumnType("tinyint") .HasComment("일반상품 시장 구분 (1=석유, 2=금, 3=배출권)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가 (TDD_HGPRC) — 석유 0"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가 (TDD_LWPRC) — 석유 0"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명 (ISU_NM) — 석유는 유종구분"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가 (TDD_OPNPRC) — 석유 0"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (ACC_TRDVAL, 원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량 (ACC_TRDVOL)"); b.Property("WeightedDiscussionPrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("가중평균가격_협의 (WT_DIS_AVG_PRC) — 석유만"); b.HasKey("ID"); b.HasIndex("CommodityMarket", "Code", "TradeDate") .IsUnique(); b.HasIndex("CommodityMarket", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("CommodityDailyTrade", null, t => { t.HasComment("일반상품(석유/금/배출권) 일별매매 시세 (KRX OpenAPI gen)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.Disclosure", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CorpCls") .IsRequired() .HasMaxLength(1) .HasColumnType("nvarchar(1)") .HasComment("법인구분 (corp_cls, Y유가/K코스닥/N코넥스/E기타)"); b.Property("CorpCode") .IsRequired() .HasMaxLength(8) .HasColumnType("nvarchar(8)") .HasComment("고유번호 (corp_code, 8자리)"); b.Property("CorpName") .IsRequired() .HasMaxLength(150) .HasColumnType("nvarchar(150)") .HasComment("법인명 (corp_name)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FlrNm") .IsRequired() .HasMaxLength(150) .HasColumnType("nvarchar(150)") .HasComment("공시 제출인명 (flr_nm)"); b.Property("RceptDt") .HasColumnType("date") .HasComment("접수일자 (rcept_dt)"); b.Property("RceptNo") .IsRequired() .HasMaxLength(14) .HasColumnType("nvarchar(14)") .HasComment("접수번호 (rcept_no, 14자리)"); b.Property("ReportNm") .IsRequired() .HasMaxLength(400) .HasColumnType("nvarchar(400)") .HasComment("보고서명 (report_nm)"); b.Property("Rm") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("비고 (rm)"); b.Property("StockCode") .HasMaxLength(6) .HasColumnType("nvarchar(6)") .HasComment("종목코드 (stock_code, 6자리) — 비상장이면 null"); b.HasKey("ID"); b.HasIndex("RceptDt") .IsDescending(); b.HasIndex("RceptNo") .IsUnique(); b.HasIndex("StockCode", "RceptDt") .IsDescending(false, true); b.ToTable("Disclosure", null, t => { t.HasComment("전자공시(DART) 공시 목록 (OpenDART list.json)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.EsgIndexDailyPrice", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeVal") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일비 (PRV_DD_CMPR)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("현재가/종가 (CLSPRC_IDX)"); b.Property("ConstituentCount") .HasColumnType("int") .HasComment("구성종목수 (TRD_ISU_CNT)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FlucRateBp") .HasColumnType("int") .HasComment("등락률 basis point (%×100, UPDN_RATE)"); b.Property("IndexName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("지수명 (IDX_NM)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("Value") .HasColumnType("bigint") .HasComment("거래대금 (ACC_TRDVAL, 백만원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량 (ACC_TRDVOL, 천주)"); b.HasKey("ID"); b.HasIndex("TradeDate"); b.HasIndex("IndexName", "TradeDate") .IsUnique(); b.ToTable("EsgIndexDailyPrice", null, t => { t.HasComment("ESG 지수 일별시세 (KRX OpenAPI esg/esg_index_info)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.EsgSecurity", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일비 (CMPPREVDD_PRC)"); b.Property("ChangeRate") .HasPrecision(9, 2) .HasColumnType("decimal(9,2)") .HasComment("등락률 % (FLUC_RT)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("현재가/종가 (TDD_CLSPRC)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ListedShares") .HasColumnType("bigint") .HasComment("상장좌수 (LIST_SHRS)"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명 (ISU_ABBRV)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금(원) (ACC_TRDVAL)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량(좌) (ACC_TRDVOL)"); b.HasKey("ID"); b.HasIndex("Name", "TradeDate") .IsUnique(); b.HasIndex("TradeDate", "TradeValue") .IsDescending(false, true); b.ToTable("EsgSecurity", null, t => { t.HasComment("ESG 증권상품 일별시세 (KRX OpenAPI esg/esg_etp_info)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.EtpDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BaseIndexClose") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("기초지수 종가 (ETF/ETN)"); b.Property("BaseIndexName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("기초지수명 (ETF/ETN)"); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비"); b.Property("ChangeRate") .HasPrecision(7, 2) .HasColumnType("decimal(7,2)") .HasComment("등락률 % (ELW 는 0)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가"); b.Property("Code") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("단축코드 (ISU_CD)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("EtpType") .HasColumnType("tinyint") .HasComment("증권상품 구분 (1=ETF, 2=ETN, 3=ELW)"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가"); b.Property("ListedShares") .HasColumnType("bigint") .HasComment("상장증권수/상장좌수"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가"); b.Property("MarketCap") .HasColumnType("bigint") .HasComment("시가총액 (원)"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명"); b.Property("Nav") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("ETF NAV / ETN 지표가치(IV)"); b.Property("NetAssetTotal") .HasColumnType("bigint") .HasComment("ETF 순자산총액 / ETN 지표가치총액 (원)"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (원)"); b.Property("Underlying") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("ELW 기초자산명"); b.Property("UnderlyingClose") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("ELW 기초자산 종가"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량"); b.HasKey("ID"); b.HasIndex("EtpType", "Code", "TradeDate") .IsUnique(); b.HasIndex("EtpType", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("EtpDailyTrade", null, t => { t.HasComment("증권상품(ETF/ETN/ELW) 일별매매 시세 (KRX OpenAPI etp)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.ExchangeRate", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("CurrencyName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("통화명 (cur_nm)"); b.Property("CurrencyUnit") .IsRequired() .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("통화 코드 (cur_unit) — 예: USD, JPY(100)"); b.Property("DealBasRate") .HasPrecision(10, 2) .HasColumnType("decimal(10,2)") .HasComment("매매기준율 (deal_bas_r)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("Ttb") .HasPrecision(10, 2) .HasColumnType("decimal(10,2)") .HasComment("전신환 받으실 때 (ttb)"); b.Property("Tts") .HasPrecision(10, 2) .HasColumnType("decimal(10,2)") .HasComment("전신환 보내실 때 (tts)"); b.HasKey("ID"); b.HasIndex("TradeDate"); b.HasIndex("CurrencyUnit", "TradeDate") .IsUnique(); b.ToTable("ExchangeRate", null, t => { t.HasComment("일별 환율 (한국수출입은행 OpenAPI AP01 현재환율)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.FuturesDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비 (CMPPREVDD_PRC)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가 (TDD_CLSPRC)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FuturesKind") .HasColumnType("tinyint") .HasComment("선물 상품군 구분 (1=일반선물, 2=주식선물유가, 3=주식선물코스닥)"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가 (TDD_HGPRC)"); b.Property("IsuCode") .IsRequired() .HasMaxLength(12) .HasColumnType("nvarchar(12)") .HasComment("종목코드 (ISU_CD) — 8자리 영숫자"); b.Property("IsuName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가 (TDD_LWPRC)"); b.Property("MarketName") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("시장구분 (MKT_NM 정규/야간)"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가 (TDD_OPNPRC)"); b.Property("OpenInterest") .HasColumnType("bigint") .HasComment("미결제약정 (ACC_OPNINT_QTY)"); b.Property("ProductName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("상품구분 (PROD_NM)"); b.Property("SettlePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("정산가 (SETL_PRC)"); b.Property("SpotPrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("현물가 (SPOT_PRC)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (ACC_TRDVAL, 원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량 (ACC_TRDVOL)"); b.HasKey("ID"); b.HasIndex("FuturesKind", "IsuCode", "TradeDate") .IsUnique(); b.HasIndex("FuturesKind", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("FuturesDailyTrade", null, t => { t.HasComment("선물(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.IndexDailyPrice", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeVal") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("FlucRateBp") .HasColumnType("int") .HasComment("등락률 basis point (%×100)"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가"); b.Property("IndexName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("지수명"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가"); b.Property("MarketCap") .HasColumnType("bigint") .HasComment("상장시가총액 (원)"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가"); b.Property("Series") .HasColumnType("tinyint") .HasComment("계열 구분 (1=KOSPI, 2=KOSDAQ, 3=KRX)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("Value") .HasColumnType("bigint") .HasComment("거래대금 (원)"); b.Property("Volume") .HasColumnType("bigint"); b.HasKey("ID"); b.HasIndex("TradeDate"); b.HasIndex("Series", "IndexName", "TradeDate") .IsUnique(); b.ToTable("IndexDailyPrice", null, t => { t.HasComment("지수(시장) 일별 마감 시세 (KRX OpenAPI)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.InterestRate", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ItemName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("항목명 (cur_nm 등)"); b.Property("Rate") .HasPrecision(9, 4) .HasColumnType("decimal(9,4)") .HasComment("금리 % — 미고시 시 null"); b.Property("RateType") .HasColumnType("tinyint") .HasComment("금리 종류 (1=대출금리, 2=국제금리)"); b.Property("TradeDate") .HasColumnType("date"); b.HasKey("ID"); b.HasIndex("TradeDate"); b.HasIndex("RateType", "ItemName", "TradeDate") .IsUnique(); b.ToTable("InterestRate", null, t => { t.HasComment("일별 금리 (한국수출입은행 OpenAPI AP02 대출금리 / AP03 국제금리)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.MarketHoliday", b => { b.Property("Date") .HasColumnType("date"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("휴장 사유"); b.HasKey("Date"); b.ToTable("MarketHoliday", null, t => { t.HasComment("KRX 휴장일 (주말 제외, Admin 수동 관리)"); }); b.HasData( new { Date = new DateOnly(2026, 1, 1), Name = "신정" }, new { Date = new DateOnly(2026, 2, 16), Name = "설날 연휴" }, new { Date = new DateOnly(2026, 2, 17), Name = "설날" }, new { Date = new DateOnly(2026, 2, 18), Name = "설날 연휴" }, new { Date = new DateOnly(2026, 3, 2), Name = "삼일절 대체공휴일" }, new { Date = new DateOnly(2026, 5, 5), Name = "어린이날" }, new { Date = new DateOnly(2026, 5, 25), Name = "부처님오신날 대체공휴일" }, new { Date = new DateOnly(2026, 6, 3), Name = "전국동시지방선거" }, new { Date = new DateOnly(2026, 8, 17), Name = "광복절 대체공휴일" }, new { Date = new DateOnly(2026, 9, 24), Name = "추석 연휴" }, new { Date = new DateOnly(2026, 9, 25), Name = "추석" }, new { Date = new DateOnly(2026, 9, 28), Name = "추석 대체공휴일" }, new { Date = new DateOnly(2026, 10, 5), Name = "개천절 대체공휴일" }, new { Date = new DateOnly(2026, 10, 9), Name = "한글날" }, new { Date = new DateOnly(2026, 12, 25), Name = "성탄절" }, new { Date = new DateOnly(2026, 12, 31), Name = "연말 휴장일" }); }); modelBuilder.Entity("Domain.Entities.Stocks.OptionsDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비 (CMPPREVDD_PRC)"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가 (TDD_CLSPRC)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가 (TDD_HGPRC)"); b.Property("ImpliedVolatility") .HasPrecision(9, 3) .HasColumnType("decimal(9,3)") .HasComment("내재변동성 % (IMP_VOLT)"); b.Property("IsuCode") .IsRequired() .HasMaxLength(12) .HasColumnType("nvarchar(12)") .HasComment("종목코드 (ISU_CD) — 8자리 영숫자"); b.Property("IsuName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가 (TDD_LWPRC)"); b.Property("NextDayBasePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("익일정산가 (NXTDD_BAS_PRC)"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가 (TDD_OPNPRC)"); b.Property("OpenInterest") .HasColumnType("bigint") .HasComment("미결제약정 (ACC_OPNINT_QTY)"); b.Property("OptionsKind") .HasColumnType("tinyint") .HasComment("옵션 상품군 구분 (1=일반옵션, 2=주식옵션유가, 3=주식옵션코스닥)"); b.Property("ProductName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("상품구분 (PROD_NM)"); b.Property("RightType") .HasColumnType("tinyint") .HasComment("권리유형 (RGHT_TP_NM — 1=Call, 2=Put)"); b.Property("StrikePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("행사가 (ISU_NM 에서 파싱)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (ACC_TRDVAL, 원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량 (ACC_TRDVOL)"); b.HasKey("ID"); b.HasIndex("OptionsKind", "IsuCode", "TradeDate") .IsUnique(); b.HasIndex("OptionsKind", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("OptionsDailyTrade", null, t => { t.HasComment("옵션(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.SriBond", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BondType") .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("채권유형 (BND_TP_NM)"); b.Property("Code") .IsRequired() .HasMaxLength(12) .HasColumnType("nvarchar(12)") .HasComment("표준코드 (ISU_CD) — 12자리 ISIN"); b.Property("CouponRate") .HasPrecision(9, 5) .HasColumnType("decimal(9,5)") .HasComment("표면이자율 % (ISU_RT)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IssueAmount") .HasColumnType("bigint") .HasComment("발행금액 (ISU_AMT, 원)"); b.Property("IssueDate") .HasColumnType("date") .HasComment("발행일 (ISU_DD)"); b.Property("IssuerName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("발행기관 (ISUR_NM)"); b.Property("ListAmount") .HasColumnType("bigint") .HasComment("상장금액 (LIST_AMT, 원)"); b.Property("ListDate") .HasColumnType("date") .HasComment("상장일 (LIST_DD)"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명 (ISU_NM)"); b.Property("RedemptionDate") .HasColumnType("date") .HasComment("상환일 (REDMPT_DD)"); b.Property("SriBondType") .IsRequired() .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasComment("채권종류 (SRI_BND_TP_NM)"); b.Property("TradeDate") .HasColumnType("date"); b.HasKey("ID"); b.HasIndex("Code", "TradeDate") .IsUnique(); b.HasIndex("TradeDate", "SriBondType"); b.ToTable("SriBond", null, t => { t.HasComment("사회책임투자채권(SRI) 정보 스냅샷 (KRX OpenAPI esg/sri_bond_info)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.Stock", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("단축코드"); b.Property("CorpCode") .HasMaxLength(8) .HasColumnType("nchar(8)") .IsFixedLength() .HasComment("DART 고유번호"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DelistedDate") .HasColumnType("date"); b.Property("EnglishName") .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("ISIN") .HasMaxLength(12) .HasColumnType("nchar(12)") .IsFixedLength() .HasComment("표준코드"); b.Property("IsActive") .HasColumnType("bit"); b.Property("LastChangeRate") .HasPrecision(7, 2) .HasColumnType("decimal(7,2)"); b.Property("LastClosePrice") .HasColumnType("int"); b.Property("LastTradingDate") .HasColumnType("date"); b.Property("ListedDate") .HasColumnType("date"); b.Property("Market") .HasColumnType("tinyint") .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)"); b.Property("MarketCap") .HasColumnType("bigint"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)"); b.Property("SectorName") .HasMaxLength(100) .HasColumnType("nvarchar(100)"); b.Property("TradingStatus") .HasColumnType("tinyint") .HasComment("거래 상태 (0=정상, 1=거래정지, 2=관리종목)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique(); b.HasIndex("CorpCode"); b.HasIndex("ISIN") .IsUnique() .HasFilter("[ISIN] IS NOT NULL"); b.HasIndex("Name"); b.HasIndex("Market", "IsActive"); b.ToTable("Stock", null, t => { t.HasComment("종목 마스터 (KRX 상장종목)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.StockBoardStats", b => { b.Property("StockCode") .HasMaxLength(6) .HasColumnType("nchar(6)") .IsFixedLength() .HasComment("종목 단축코드 (PK)"); b.Property("Comments") .HasColumnType("int") .HasComment("댓글 수"); b.Property("LastPostAt") .HasColumnType("datetime2") .HasComment("마지막 글 작성 일시"); b.Property("Posts") .HasColumnType("int") .HasComment("게시글 수"); b.Property("UpdatedAt") .HasColumnType("datetime2") .HasComment("갱신 일시"); b.HasKey("StockCode"); b.ToTable("StockBoardStats", null, t => { t.HasComment("종목 가상보드 통계 (글/댓글 수)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasColumnType("int"); b.Property("ChangeRate") .HasPrecision(7, 2) .HasColumnType("decimal(7,2)") .HasComment("등락률 %"); b.Property("Close") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("High") .HasColumnType("int"); b.Property("ListedShares") .HasColumnType("bigint"); b.Property("Low") .HasColumnType("int"); b.Property("MarketCap") .HasColumnType("bigint"); b.Property("Open") .HasColumnType("int"); b.Property("StockID") .HasColumnType("int"); b.Property("TradingDate") .HasColumnType("date"); b.Property("TradingValue") .HasColumnType("bigint"); b.Property("Volume") .HasColumnType("bigint"); b.HasKey("ID"); b.HasIndex("StockID", "TradingDate") .IsUnique(); b.HasIndex("TradingDate", "ChangeRate") .IsDescending(false, true); b.HasIndex("TradingDate", "TradingValue") .IsDescending(false, true); b.ToTable("StockDailyPrice", null, t => { t.HasComment("T+1 일별 마감 시세 (금융위 API)"); }); }); modelBuilder.Entity("Domain.Entities.Stocks.WarrantDailyTrade", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("bigint"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ChangeAmount") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("전일 대비"); b.Property("ChangeRate") .HasPrecision(7, 2) .HasColumnType("decimal(7,2)") .HasComment("등락률 %"); b.Property("Close") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("종가"); b.Property("Code") .IsRequired() .HasMaxLength(12) .HasColumnType("nvarchar(12)") .HasComment("단축코드 (ISU_CD) — 8자리 영숫자"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DelistDate") .HasColumnType("date") .HasComment("상장폐지일 (증서, DELIST_DD)"); b.Property("ExerciseEndDate") .HasColumnType("date") .HasComment("행사 종료일 (증권, EXST_END_DD)"); b.Property("ExercisePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("행사가 (증권, EXER_PRC)"); b.Property("ExerciseStartDate") .HasColumnType("date") .HasComment("행사 시작일 (증권, EXST_STRT_DD)"); b.Property("High") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("고가"); b.Property("IssuePrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("발행가 (증서, ISU_PRC)"); b.Property("ListedShares") .HasColumnType("bigint") .HasComment("상장증권수"); b.Property("Low") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("저가"); b.Property("Market") .HasColumnType("tinyint") .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)"); b.Property("MarketCap") .HasColumnType("bigint") .HasComment("시가총액 (원)"); b.Property("Name") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("종목명"); b.Property("Open") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("시가"); b.Property("TargetStockCode") .HasMaxLength(6) .HasColumnType("nvarchar(6)") .HasComment("대상주식 단축코드 (TARSTK_ISU_SRT_CD)"); b.Property("TargetStockName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("대상주식명 (TARSTK_ISU_NM)"); b.Property("TargetStockPrice") .HasPrecision(18, 2) .HasColumnType("decimal(18,2)") .HasComment("대상주식 현재가 (TARSTK_ISU_PRSNT_PRC)"); b.Property("TradeDate") .HasColumnType("date"); b.Property("TradeValue") .HasColumnType("bigint") .HasComment("거래대금 (원)"); b.Property("Volume") .HasColumnType("bigint") .HasComment("거래량"); b.Property("WarrantType") .HasColumnType("tinyint") .HasComment("신주인수권 구분 (1=증권, 2=증서)"); b.HasKey("ID"); b.HasIndex("WarrantType", "Code", "TradeDate") .IsUnique(); b.HasIndex("WarrantType", "TradeDate", "TradeValue") .IsDescending(false, false, true); b.ToTable("WarrantDailyTrade", null, t => { t.HasComment("신주인수권증권/증서 일별매매 시세 (KRX OpenAPI sto sw/sr)"); }); }); modelBuilder.Entity("Domain.Entities.Store.Coupon", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("ExpiresAt") .HasColumnType("datetime2"); b.Property("GameID") .HasColumnType("int") .HasComment("게임 ID (필수)"); b.Property("GeneratedCount") .HasColumnType("int"); b.Property("LowStockThreshold") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(10); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)"); b.Property("ProductID") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("UsagePolicy") .HasColumnType("int"); b.Property("UsedCount") .HasColumnType("int"); b.HasKey("ID"); b.HasIndex("GameID"); b.HasIndex("ProductID"); b.ToTable("Coupon", null, t => { t.HasComment("쿠폰 메타 (코드 풀의 상위)"); }); }); modelBuilder.Entity("Domain.Entities.Store.CouponCode", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Code") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("코드 평문 (사용자 표시용)"); b.Property("CodeHash") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)") .HasComment("SHA-256 hex (UNIQUE, 조회용)"); b.Property("CouponID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IssuedAt") .HasColumnType("datetime2"); b.Property("IssuedToMemberID") .HasColumnType("int"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("Status") .HasColumnType("int") .HasComment("상태 (1=Available, 2=Reserved, 3=Issued, 4=Used)"); b.Property("UsedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("CodeHash") .IsUnique(); b.HasIndex("IssuedToMemberID"); b.HasIndex("CouponID", "Status"); b.ToTable("CouponCode", null, t => { t.HasComment("쿠폰 코드 풀 (Code 평문 + CodeHash SHA-256 hex)"); }); }); modelBuilder.Entity("Domain.Entities.Store.Game", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BigImage") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("큰 이미지 (상세/배너용)"); b.Property("Code") .HasMaxLength(6) .HasColumnType("nvarchar(6)") .HasComment("게임 코드 (UNIQUE, 외부 연동/내부 식별)"); b.Property("CommissionRate") .HasPrecision(10, 7) .HasColumnType("decimal(10,7)") .HasComment("게임사 수익률(%) — 0~100, 소수점 7자리"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("Description") .HasColumnType("nvarchar(max)") .HasComment("게임 소개 (CKEditor HTML)"); b.Property("EngName") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("게임 영문명"); b.Property("IsActive") .HasColumnType("bit"); b.Property("KorName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("게임 한글명"); b.Property("Link") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("게임 다운로드/공식 사이트 주소"); b.Property("MinSpec") .HasColumnType("nvarchar(max)") .HasComment("최소 사양 (자유 텍스트)"); b.Property("Order") .HasColumnType("int"); b.Property("Publisher") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("게임사/퍼블리셔"); b.Property("RecommendedSpec") .HasColumnType("nvarchar(max)") .HasComment("권장 사양 (자유 텍스트)"); b.Property("ReleaseDate") .HasColumnType("date") .HasComment("게임 출시일"); b.Property("Thumbnail") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("작은 이미지 (목록 카드용)"); b.Property("TrailerUrl") .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("YouTube 예고편 URL"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("Code") .IsUnique() .HasFilter("[Code] IS NOT NULL"); b.HasIndex("KorName") .IsUnique(); b.HasIndex("IsActive", "Order"); b.ToTable("Game", null, t => { t.HasComment("상점 제휴 게임"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameCategory", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("EngName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("카테고리 영문명"); b.Property("IsActive") .HasColumnType("bit"); b.Property("KorName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("카테고리 한글명"); b.Property("Order") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("KorName") .IsUnique(); b.HasIndex("IsActive", "Order"); b.ToTable("GameCategory", null, t => { t.HasComment("게임 카테고리 코드"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b => { b.Property("GameID") .HasColumnType("int"); b.Property("GameCategoryID") .HasColumnType("int"); b.HasKey("GameID", "GameCategoryID"); b.HasIndex("GameCategoryID"); b.ToTable("GameCategoryMap", null, t => { t.HasComment("게임-카테고리 N:M"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameGenre", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("EngName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("장르 영문명"); b.Property("IsActive") .HasColumnType("bit"); b.Property("KorName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("장르 한글명"); b.Property("Order") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("KorName") .IsUnique(); b.HasIndex("IsActive", "Order"); b.ToTable("GameGenre", null, t => { t.HasComment("게임 장르 코드"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b => { b.Property("GameID") .HasColumnType("int"); b.Property("GameGenreID") .HasColumnType("int"); b.HasKey("GameID", "GameGenreID"); b.HasIndex("GameGenreID"); b.ToTable("GameGenreMap", null, t => { t.HasComment("게임-장르 N:M"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameImage", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int") .HasComment("PK"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("ContentType") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("MIME"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DisabledAt") .HasColumnType("datetime2") .HasComment("비활성 일시"); b.Property("Extension") .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasComment("확장자"); b.Property("FileName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("원본 파일명"); b.Property("GameID") .HasColumnType("int"); b.Property("HashedName") .IsRequired() .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasComment("저장 파일명(해시)"); b.Property("Height") .HasColumnType("smallint") .HasComment("세로 픽셀"); b.Property("IsDisabled") .HasColumnType("bit") .HasComment("비활성 여부"); b.Property("Order") .HasColumnType("int") .HasComment("정렬 순서"); b.Property("Path") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)") .HasComment("상대 경로"); b.Property("Size") .HasColumnType("bigint") .HasComment("바이트 크기"); b.Property("UUID") .HasColumnType("uniqueidentifier") .HasComment("UUID"); b.Property("Url") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasComment("접근 URL"); b.Property("Width") .HasColumnType("smallint") .HasComment("가로 픽셀"); b.HasKey("ID"); b.HasIndex("GameID"); b.HasIndex("UUID") .IsUnique(); b.HasIndex("GameID", "IsDisabled"); b.ToTable("GameImage", null, t => { t.HasComment("게임 상세 이미지 갤러리"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("EngName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("언어 영문명"); b.Property("IsActive") .HasColumnType("bit"); b.Property("KorName") .IsRequired() .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasComment("언어 한글명"); b.Property("Order") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("KorName") .IsUnique(); b.HasIndex("IsActive", "Order"); b.ToTable("GameLanguage", null, t => { t.HasComment("게임 지원 언어 마스터"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b => { b.Property("GameID") .HasColumnType("int"); b.Property("GameLanguageID") .HasColumnType("int"); b.Property("FullAudio") .HasColumnType("bit") .HasComment("풀 오디오(음성) 지원"); b.Property("Interface") .HasColumnType("bit") .HasComment("인터페이스 지원"); b.Property("Subtitles") .HasColumnType("bit") .HasComment("자막 지원"); b.HasKey("GameID", "GameLanguageID"); b.HasIndex("GameLanguageID"); b.ToTable("GameLanguageSupport", null, t => { t.HasComment("게임별 언어 지원 (인터페이스/풀오디오/자막)"); }); }); modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AdminMemo") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("GameID") .HasColumnType("int"); b.Property("Month") .HasColumnType("int"); b.Property("OrderCount") .HasColumnType("int"); b.Property("SettledAt") .HasColumnType("datetime2"); b.Property("SettledByAdminEmail") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("SettledByAdminUserId") .HasMaxLength(450) .HasColumnType("nvarchar(450)"); b.Property("Status") .HasColumnType("int") .HasComment("정산 상태 (1=Pending, 2=Settled)"); b.Property("TotalRevenueAmount") .HasColumnType("int"); b.Property("Year") .HasColumnType("int"); b.HasKey("ID"); b.HasIndex("GameID", "Year", "Month") .IsUnique(); b.HasIndex("Year", "Month", "Status"); b.ToTable("GameSettlement", null, t => { t.HasComment("게임사 월별 정산 큐"); }); }); modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Address1_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("기본 주소 (암호화)"); b.Property("Address2_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("상세 주소 (암호화)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IsDefault") .HasColumnType("bit"); b.Property("KeyVersion") .HasColumnType("int") .HasComment("암호화 키 버전"); b.Property("MemberID") .HasColumnType("int"); b.Property("Phone_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("연락처 (암호화)"); b.Property("RecipientName_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("수령인명 (암호화)"); b.Property("RecipientName_Hash") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)") .HasComment("수령인명 SHA-256 hex (검색용)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("ZipCode") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)"); b.HasKey("ID"); b.HasIndex("RecipientName_Hash"); b.HasIndex("MemberID", "IsDefault"); b.ToTable("MemberAddress", null, t => { t.HasComment("회원 배송 주소 (AES-GCM 암호화)"); }); }); modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AcquiredAt") .HasColumnType("datetime2"); b.Property("CouponCodeID") .HasColumnType("int"); b.Property("DeletedAt") .HasColumnType("datetime2") .HasComment("사용자 보관함 소프트 삭제 일시. NULL = 보관함 노출"); b.Property("ExpiresAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int"); b.Property("OrderItemID") .HasColumnType("int"); b.Property("UsedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("CouponCodeID") .IsUnique(); b.HasIndex("OrderItemID"); b.HasIndex("MemberID", "DeletedAt"); b.HasIndex("MemberID", "UsedAt"); b.ToTable("MemberInventory", null, t => { t.HasComment("회원 보관함 (Digital 상품)"); }); }); modelBuilder.Entity("Domain.Entities.Store.Order", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CancelReason") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("ChannelID") .HasColumnType("int") .HasComment("후원 채널 (선택)"); b.Property("ChannelRewardAmount") .HasColumnType("int") .HasComment("채널주 채널 보상 입금 금액 (비활성 — 과거 주문 호환)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("GameRevenueAmount") .HasColumnType("int") .HasComment("게임사 정산 큐 적재 금액"); b.Property("GiftMessage") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("선물 메시지"); b.Property("GiftToMemberID") .HasColumnType("int") .HasComment("선물 수신자 회원 ID (null=본인구매)"); b.Property("MemberID") .HasColumnType("int"); b.Property("OrderNumber") .IsRequired() .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasComment("주문 번호 (UNIQUE)"); b.Property("PaidAt") .HasColumnType("datetime2"); b.Property("PlatformFeeAmount") .HasColumnType("int") .HasComment("dpot 몫"); b.Property("RefundReason") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("Status") .HasColumnType("int") .HasComment("주문 상태"); b.Property("TotalAmount") .HasColumnType("int") .HasComment("총 결제 금액"); b.HasKey("ID"); b.HasIndex("ChannelID"); b.HasIndex("OrderNumber") .IsUnique(); b.HasIndex("Status", "CreatedAt"); b.HasIndex("MemberID", "Status", "CreatedAt"); b.ToTable("Order", null, t => { t.HasComment("상점 주문 헤더"); }); }); modelBuilder.Entity("Domain.Entities.Store.OrderItem", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("IssuedCouponCodeID") .HasColumnType("int") .HasComment("Digital 상품 발급 쿠폰 코드"); b.Property("OrderID") .HasColumnType("int"); b.Property("ProductID") .HasColumnType("int"); b.Property("Quantity") .HasColumnType("int"); b.Property("UnitPrice") .HasColumnType("int") .HasComment("주문 시점 상품 단가 스냅샷"); b.HasKey("ID"); b.HasIndex("IssuedCouponCodeID"); b.HasIndex("OrderID"); b.HasIndex("ProductID"); b.ToTable("OrderItem", null, t => { t.HasComment("주문 라인"); }); }); modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("AdminEmail") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("AdminMemo") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("AdminUserId") .HasMaxLength(450) .HasColumnType("nvarchar(450)"); b.Property("Amount") .HasColumnType("int"); b.Property("OrderID") .HasColumnType("int"); b.Property("Reason") .IsRequired() .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("ReasonType") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(7) .HasComment("사유 유형 (1=ChangedMind, 2=OptionChange, 3=ProductDefect, 4=ProductInfoMismatch, 5=DeliveryDelay, 6=WrongDelivery, 7=Other)"); b.Property("RequestedAt") .HasColumnType("datetime2"); b.Property("ResolvedAt") .HasColumnType("datetime2"); b.Property("Status") .HasColumnType("int") .HasComment("상태 (1=Requested, 2=Approved, 3=Rejected, 4=Completed)"); b.Property("Type") .HasColumnType("int") .HasComment("유형 (1=Cancel, 2=Return, 3=Exchange, 4=Refund)"); b.HasKey("ID"); b.HasIndex("Status"); b.HasIndex("OrderID", "Status"); b.ToTable("OrderRefund", null, t => { t.HasComment("통합 환불 이력 (취소/반품/교환/환불)"); }); }); modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CouponCodeID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("OrderItemID") .HasColumnType("int"); b.Property("OrderRefundID") .HasColumnType("int"); b.Property("PostRefundAction") .HasColumnType("int") .HasComment("쿠폰 후처리 (1=Restore 회수, 2=Expire 만료)"); b.Property("UnitAmount") .HasColumnType("int") .HasComment("환불 단가 스냅샷"); b.HasKey("ID"); b.HasIndex("CouponCodeID") .IsUnique(); b.HasIndex("OrderItemID"); b.HasIndex("OrderRefundID"); b.ToTable("OrderRefundItem", null, t => { t.HasComment("환불 단위 — 쿠폰 별 후처리(회수/만료) 정책. OrderRefund 1:N"); }); }); modelBuilder.Entity("Domain.Entities.Store.Product", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("Description") .HasColumnType("nvarchar(max)"); b.Property("DiscountType") .HasColumnType("tinyint"); b.Property("DiscountValue") .HasColumnType("int"); b.Property("DurationDays") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(0) .HasComment("아이템 효과 지속일 (0=즉시소모/영구)"); b.Property("EffectPayload") .HasColumnType("nvarchar(max)") .HasComment("지위 아이템 효과 페이로드 JSON (색상·아이콘·애니메이션)"); b.Property("GameID") .HasColumnType("int") .HasComment("게임 ID (선택 — null=플랫폼 직접판매)"); b.Property("IsActive") .HasColumnType("bit"); b.Property("IsGiftable") .ValueGeneratedOnAdd() .HasColumnType("bit") .HasDefaultValue(false) .HasComment("선물하기 가능 여부"); b.Property("ItemKind") .HasColumnType("tinyint") .HasComment("아이템 종류 (null=일반상품, 2~4=지위, 5~11=소모품)"); b.Property("MaxPurchase") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(999) .HasComment("1회 주문 최대 구매 수량 (하드 상한 999)"); b.Property("MinPurchase") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(1) .HasComment("1회 주문 최소 구매 수량"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasComment("상품명"); b.Property("Order") .HasColumnType("int"); b.Property("Price") .HasColumnType("int") .HasComment("판매가 (KRW)"); b.Property("RequireDonationChannel") .ValueGeneratedOnAdd() .HasColumnType("bit") .HasDefaultValue(false) .HasComment("구매 시 후원 채널 선택 필수 여부"); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("SaleEndAt") .HasColumnType("datetime2"); b.Property("SaleStartAt") .HasColumnType("datetime2"); b.Property("Stock") .HasColumnType("int") .HasComment("재고 (-1=무제한)"); b.Property("Thumbnail") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("Type") .HasColumnType("int") .HasComment("상품 유형 (1=Physical, 2=Digital)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.HasKey("ID"); b.HasIndex("IsActive", "Type"); b.HasIndex("ItemKind", "IsActive"); b.HasIndex("GameID", "IsActive", "Order"); b.ToTable("Product", null, t => { t.HasComment("상점 상품"); }); }); modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b => { b.Property("ProductID") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("MaxQuantity") .HasColumnType("int") .HasComment("회원당 누적 최대 구매 수량 (0=무제한)"); b.Property("PeriodEndAt") .HasColumnType("datetime2") .HasComment("Custom 시 절대 윈도우 종료 시각 (UTC)"); b.Property("PeriodStartAt") .HasColumnType("datetime2") .HasComment("Custom 시 절대 윈도우 시작 시각 (UTC)"); b.Property("PeriodType") .HasColumnType("int") .HasComment("기간 유형 (0=None, 1=Day, 2=Week, 3=Month, 4=Custom)"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("UsePeriodLimit") .HasColumnType("bit") .HasComment("기간 제한 사용 여부"); b.Property("UseQuantityLimit") .HasColumnType("bit") .HasComment("수량 제한 사용 여부"); b.HasKey("ProductID"); b.ToTable("ProductLimitConfig", null, t => { t.HasComment("상품 판매 정책 (1:1 with Product)"); }); }); modelBuilder.Entity("Domain.Entities.Store.Shipment", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("Address1_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("Address2_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("AdminMemo") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("Carrier") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("DeliveredAt") .HasColumnType("datetime2"); b.Property("KeyVersion") .HasColumnType("int"); b.Property("OrderID") .HasColumnType("int"); b.Property("Phone_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("RecipientName_Encrypted") .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("ShippedAt") .HasColumnType("datetime2"); b.Property("ShippingFee") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(0); b.Property("Status") .HasColumnType("int"); b.Property("TrackingNumber") .HasMaxLength(50) .HasColumnType("nvarchar(50)"); b.Property("ZipCode") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)"); b.HasKey("ID"); b.HasIndex("OrderID") .IsUnique(); b.HasIndex("Status"); b.HasIndex("TrackingNumber"); b.ToTable("Shipment", null, t => { t.HasComment("배송 (주문 시점 주소 스냅샷, 암호화)"); }); }); modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("MemberID") .HasColumnType("int"); b.Property("UpdatedAt") .HasColumnType("datetime2"); b.Property("WalletKey") .HasColumnType("uniqueidentifier"); b.HasKey("ID"); b.HasIndex("MemberID") .IsUnique(); b.HasIndex("WalletKey") .IsUnique(); b.ToTable("Wallet", null, t => { t.HasComment("회원 지갑"); }); }); modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("RowVersion") .IsConcurrencyToken() .IsRequired() .ValueGeneratedOnAddOrUpdate() .HasColumnType("rowversion"); b.Property("Type") .HasColumnType("int"); b.Property("WalletKey") .HasColumnType("uniqueidentifier"); b.HasKey("ID"); b.HasIndex("WalletKey", "Type") .IsUnique(); b.ToTable("WalletBalance", null, t => { t.HasComment("회원 지갑 잔액"); }); }); modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); b.Property("BalanceType") .HasColumnType("int"); b.Property("CreatedAt") .HasColumnType("datetime2"); b.Property("Memo") .HasMaxLength(500) .HasColumnType("nvarchar(500)"); b.Property("Reason") .IsRequired() .HasMaxLength(1000) .HasColumnType("nvarchar(1000)"); b.Property("RefID") .HasMaxLength(100) .HasColumnType("nvarchar(100)"); b.Property("TxType") .HasColumnType("int"); b.Property("UserID") .HasMaxLength(100) .HasColumnType("nvarchar(100)"); b.Property("WalletKey") .HasColumnType("uniqueidentifier"); b.HasKey("ID"); b.HasIndex("CreatedAt"); b.HasIndex("WalletKey"); b.HasIndex("WalletKey", "CreatedAt"); b.ToTable("WalletTransaction", null, t => { t.HasComment("회원 거래 장부"); }); }); modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b => { b.HasOne("Domain.Entities.Members.Member", null) .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); }); modelBuilder.Entity("Domain.Entities.Common.Config", b => { b.OwnsOne("Domain.Entities.Common.AccountConfig", "Account", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("ChangeEmailDay") .HasColumnType("int") .HasColumnName("Account_ChangeEmailDay") .HasComment("이메일 갱신 주기(일)"); b1.Property("ChangeIntroDay") .HasColumnType("int") .HasColumnName("Account_ChangeIntroDay") .HasComment("자기소개 갱신 주기(일)"); b1.Property("ChangeNameDay") .HasColumnType("int") .HasColumnName("Account_ChangeNameDay") .HasComment("별명 갱신 주기(일)"); b1.Property("ChangePasswordDay") .HasColumnType("int") .HasColumnName("Account_ChangePasswordDay") .HasComment("비밀번호 갱신 주기(일)"); b1.Property("ChangeSummaryDay") .HasColumnType("int") .HasColumnName("Account_ChangeSummaryDay") .HasComment("한마디 갱신 주기(일)"); b1.Property("ChangeThumbDay") .HasColumnType("int") .HasColumnName("Account_ChangeThumbDay") .HasComment("프로필 이미지 갱신 주기(일)"); b1.Property("DeniedEmailList") .HasColumnType("nvarchar(max)") .HasColumnName("Account_DeniedEmailList") .HasComment("금지 이메일"); b1.Property("DeniedNameList") .HasColumnType("nvarchar(max)") .HasColumnName("Account_DeniedNameList") .HasComment("금지 별명"); b1.Property("IsLoginEmailVerifiedOnly") .HasColumnType("bit"); b1.Property("IsRegisterBlock") .HasColumnType("bit") .HasColumnName("Account_IsRegisterBlock") .HasComment("회원가입 차단"); b1.Property("IsRegisterEmailAuth") .HasColumnType("bit") .HasColumnName("Account_IsRegisterEmailAuth") .HasComment("회원가입 시 이메일 인증"); b1.Property("MaxLoginTryCount") .HasColumnType("int") .HasColumnName("Account_MaxLoginTryCount") .HasComment("로그인 시도 제한 횟수"); b1.Property("MaxLoginTryLimitSecond") .HasColumnType("int") .HasColumnName("Account_MaxLoginTryLimitSecond") .HasComment("로그인 시도 제한 시간(초)"); b1.Property("PasswordMinLength") .HasColumnType("int") .HasColumnName("Account_PasswordMinLength") .HasComment("비밀번호 최소 길이"); b1.Property("PasswordNumbersLength") .HasColumnType("int") .HasColumnName("Account_PasswordNumbersLength") .HasComment("비밀번호 최소 숫자 수"); b1.Property("PasswordSpecialcharsLength") .HasColumnType("int") .HasColumnName("Account_PasswordSpecialcharsLength") .HasComment("비밀번호 최소 특수문자 수"); b1.Property("PasswordUppercaseLength") .HasColumnType("int") .HasColumnName("Account_PasswordUppercaseLength") .HasComment("비밀번호 최소 대문자 수"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.AttendanceConfig", "Attendance", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("BaseExp") .HasColumnType("int") .HasColumnName("Attendance_BaseExp") .HasComment("기본 경험치"); b1.Property("BasePoint") .HasColumnType("int") .HasColumnName("Attendance_BasePoint") .HasComment("기본 포인트"); b1.Property("IsEnabled") .HasColumnType("bit") .HasColumnName("Attendance_IsEnabled") .HasComment("출석 기능 활성화"); b1.Property("RankBonusConfig") .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") .HasColumnName("Attendance_RankBonusConfig") .HasComment("순위별 보상 설정 (JSON)"); b1.Property("StreakBonusMaxDays") .HasColumnType("int") .HasColumnName("Attendance_StreakBonusMaxDays") .HasComment("가중치 최대 적용 일수"); b1.Property("StreakBonusPerDay") .HasColumnType("int") .HasColumnName("Attendance_StreakBonusPerDay") .HasComment("1일당 추가 경험치"); b1.Property("StreakBonusPointPerDay") .HasColumnType("int") .HasColumnName("Attendance_StreakBonusPointPerDay") .HasComment("1일당 추가 포인트"); b1.Property("UseRankBonus") .HasColumnType("bit") .HasColumnName("Attendance_UseRankBonus") .HasComment("순위 보상 사용"); b1.Property("UseStreakBonus") .HasColumnType("bit") .HasColumnName("Attendance_UseStreakBonus") .HasComment("연속 출석 가중치 사용"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.BasicConfig", "Basic", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("AdminWhiteIPList") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasColumnName("Basic_AdminWhiteIPList") .HasComment("관리자단 접근 가능 IP"); b1.Property("BlockAlertContent") .HasMaxLength(5000) .HasColumnType("nvarchar(max)") .HasColumnName("Basic_BlockAlertContent") .HasComment("차단 시 안내문 내용"); b1.Property("BlockAlertTitle") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasColumnName("Basic_BlockAlertTitle") .HasComment("차단 시 안내문 제목"); b1.Property("FromEmail") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Basic_FromEmail") .HasComment("송수신 이메일"); b1.Property("FromName") .HasMaxLength(30) .HasColumnType("nvarchar(30)") .HasColumnName("Basic_FromName") .HasComment("송수신자 이름"); b1.Property("FrontWhiteIPList") .HasMaxLength(1000) .HasColumnType("nvarchar(1000)") .HasColumnName("Basic_FrontWhiteIPList") .HasComment("사용자단 접근 가능 IP"); b1.Property("IsMaintenance") .HasColumnType("bit") .HasColumnName("Basic_IsMaintenance") .HasComment("점검 여부"); b1.Property("MaintenanceContent") .HasMaxLength(5000) .HasColumnType("nvarchar(max)") .HasColumnName("Basic_MaintenanceContent") .HasComment("점검 내용"); b1.Property("NoteDailySendLimit") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(3) .HasColumnName("Basic_NoteDailySendLimit") .HasComment("쪽지 일일 발송 제한 (사용자 1인당, 시스템 제외)"); b1.Property("RootID") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Basic_RootID") .HasComment("최고 관리자 ID"); b1.Property("SiteName") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Basic_SiteName") .HasComment("사이트 이름"); b1.Property("SiteURL") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Basic_SiteURL") .HasComment("사이트 주소"); b1.Property("SmtpEnableSSL") .HasColumnType("bit") .HasColumnName("Basic_SmtpEnableSSL") .HasComment("SMTP Enable SSL"); b1.Property("SmtpPassword") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasColumnName("Basic_SmtpPassword") .HasComment("SMTP Password"); b1.Property("SmtpPort") .HasColumnType("int") .HasColumnName("Basic_SmtpPort") .HasComment("SMTP Port"); b1.Property("SmtpServer") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasColumnName("Basic_SmtpServer") .HasComment("SMTP Server"); b1.Property("SmtpUsername") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Basic_SmtpUsername") .HasComment("SMTP Username"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.ChatExpConfig", "ChatExp", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("ChatXpPerMessage") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(1) .HasColumnName("ChatExp_ChatXpPerMessage") .HasComment("채팅 1건당 지급 XP"); b1.Property("ChatXpSessionLimit") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(50) .HasColumnName("ChatExp_ChatXpSessionLimit") .HasComment("방송 세션당 채팅 XP 상한"); b1.Property("CrownTopN") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(3) .HasColumnName("ChatExp_CrownTopN") .HasComment("크라운 뱃지 Top N"); b1.Property("DonationXpPerAmount") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(1000) .HasColumnName("ChatExp_DonationXpPerAmount") .HasComment("후원 N POINT당 1 XP"); b1.Property("LeaderboardSize") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(50) .HasColumnName("ChatExp_LeaderboardSize") .HasComment("리더보드 Top N"); b1.Property("MinContentLength") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(2) .HasColumnName("ChatExp_MinContentLength") .HasComment("XP 적립 최소 글자수"); b1.Property("RateLimitSec") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(2) .HasColumnName("ChatExp_RateLimitSec") .HasComment("채팅 쿨다운(초)"); b1.Property("UxShowLeaderboard") .HasColumnType("bit") .HasColumnName("ChatExp_UxShowLeaderboard") .HasComment("watch에서 리더보드 노출"); b1.Property("UxShowMyXpBadge") .HasColumnType("bit") .HasColumnName("ChatExp_UxShowMyXpBadge") .HasComment("내 XP 뱃지 노출"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.CompanyConfig", "Company", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("AddedSaleNo") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasColumnName("Company_AddedSaleNo") .HasComment("부가통신 사업자번호"); b1.Property("Address") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Company_Address") .HasComment("사업장 소재지"); b1.Property("AdminEmail") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Company_AdminEmail") .HasComment("정보관리책임자 이메일"); b1.Property("AdminName") .HasMaxLength(70) .HasColumnType("nvarchar(70)") .HasColumnName("Company_AdminName") .HasComment("정보관리책임자"); b1.Property("BankCode") .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasColumnName("Company_BankCode") .HasComment("입금계좌 - 은행"); b1.Property("BankNumber") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Company_BankNumber") .HasComment("입금계좌 - 계좌번호"); b1.Property("BankOwner") .HasMaxLength(70) .HasColumnType("nvarchar(70)") .HasColumnName("Company_BankOwner") .HasComment("입금계좌 - 예금주"); b1.Property("Fax") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasColumnName("Company_Fax") .HasComment("FAX"); b1.Property("Hosting") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Company_Hosting") .HasComment("호스팅 서비스"); b1.Property("Name") .HasMaxLength(70) .HasColumnType("nvarchar(70)") .HasColumnName("Company_Name") .HasComment("상호 명"); b1.Property("Owner") .HasMaxLength(50) .HasColumnType("nvarchar(50)") .HasColumnName("Company_Owner") .HasComment("대표자 명"); b1.Property("RegNo") .HasMaxLength(100) .HasColumnType("nvarchar(100)") .HasColumnName("Company_RegNo") .HasComment("사업자 등록 번호"); b1.Property("RetailSaleNo") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasColumnName("Company_RetailSaleNo") .HasComment("통신판매업 신고번호"); b1.Property("SiteUrl") .HasMaxLength(200) .HasColumnType("nvarchar(200)") .HasColumnName("Company_SiteUrl") .HasComment("사이트 주소"); b1.Property("Tel") .HasMaxLength(20) .HasColumnType("nvarchar(20)") .HasColumnName("Company_Tel") .HasComment("대표 전화번호"); b1.Property("ZipCode") .HasMaxLength(8) .HasColumnType("nvarchar(8)") .HasColumnName("Company_ZipCode") .HasComment("사업장 주소(우편번호)"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.CryptoConfig", "Crypto", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("MainPageCoinCount") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(10) .HasColumnName("Crypto_MainPageCoinCount") .HasComment("메인 페이지 기본 표시 코인 수"); b1.Property("PlungeThreshold") .ValueGeneratedOnAdd() .HasColumnType("decimal(5,2)") .HasDefaultValue(-5.0m) .HasColumnName("Crypto_PlungeThreshold") .HasComment("급락 임계값 (%)"); b1.Property("SurgeThreshold") .ValueGeneratedOnAdd() .HasColumnType("decimal(5,2)") .HasDefaultValue(5.0m) .HasColumnName("Crypto_SurgeThreshold") .HasComment("급등 임계값 (%)"); b1.Property("TickerRefreshSeconds") .ValueGeneratedOnAdd() .HasColumnType("int") .HasDefaultValue(5) .HasColumnName("Crypto_TickerRefreshSeconds") .HasComment("시세 업데이트 주기 (초)"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.EmailTemplateConfig", "EmailTemplate", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("ChangedEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ChangedEmailFormContent") .HasComment("이메일 변경 완료 - 내용"); b1.Property("ChangedEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ChangedEmailFormTitle") .HasComment("이메일 변경 완료 - 제목"); b1.Property("ChangedPasswordEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ChangedPasswordEmailFormContent") .HasComment("비밀번호 변경 완료 - 내용"); b1.Property("ChangedPasswordEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ChangedPasswordEmailFormTitle") .HasComment("비밀번호 변경 완료 - 제목"); b1.Property("EmailVerifyFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_EmailVerifyFormContent") .HasComment("이메일 변경 시 - 내용"); b1.Property("EmailVerifyFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_EmailVerifyFormTitle") .HasComment("이메일 변경 시 - 제목"); b1.Property("RegisterEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_RegisterEmailFormContent") .HasComment("회원가입 시 - 내용"); b1.Property("RegisterEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_RegisterEmailFormTitle") .HasComment("회원가입 시 - 제목"); b1.Property("RegistrationEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_RegistrationEmailFormContent") .HasComment("회원가입 완료 - 내용"); b1.Property("RegistrationEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_RegistrationEmailFormTitle") .HasComment("회원가입 완료 - 제목"); b1.Property("ResetPasswordEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ResetPasswordEmailFormContent") .HasComment("비밀번호 재설정 - 내용"); b1.Property("ResetPasswordEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_ResetPasswordEmailFormTitle") .HasComment("비밀번호 재설정 - 제목"); b1.Property("WithdrawEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_WithdrawEmailFormContent") .HasComment("회원탈퇴 시 - 내용"); b1.Property("WithdrawEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_WithdrawEmailFormTitle") .HasComment("회원탈퇴 시 - 제목"); b1.Property("WithdrawVerifyEmailFormContent") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormContent") .HasComment("회원탈퇴 인증 - 내용"); b1.Property("WithdrawVerifyEmailFormTitle") .HasColumnType("nvarchar(max)") .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormTitle") .HasComment("회원탈퇴 인증 - 제목"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.ExternalApiConfig", "External", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("GoogleAppId") .HasColumnType("nvarchar(max)") .HasColumnName("External_GoogleAppId") .HasComment("Google APP ID"); b1.Property("GoogleClientId") .HasColumnType("nvarchar(max)") .HasColumnName("External_GoogleClientId") .HasComment("Google Client ID"); b1.Property("GoogleClientSecretEnc") .HasColumnType("nvarchar(max)") .HasColumnName("External_GoogleClientSecretEnc") .HasComment("Google Client Secret (암호화 저장 권장)"); b1.Property("TossLiveClientKeyEnc") .HasColumnType("nvarchar(max)"); b1.Property("TossLiveSecretKeyEnc") .HasColumnType("nvarchar(max)"); b1.Property("TossPayMode") .HasColumnType("nvarchar(max)"); b1.Property("TossTestClientKeyEnc") .HasColumnType("nvarchar(max)"); b1.Property("TossTestSecretKeyEnc") .HasColumnType("nvarchar(max)"); b1.Property("YouTubeApiKeyEnc") .HasColumnType("nvarchar(max)") .HasColumnName("External_YouTubeApiKeyEnc") .HasComment("YouTube API Key (암호화 저장 권장)"); b1.Property("YouTubeApiName") .HasColumnType("nvarchar(max)") .HasColumnName("External_YouTubeApiName") .HasComment("YouTube API Name"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.ImagesConfig", "Images", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("AppIcon_192") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_AppIcon_192") .HasComment("App-icon-192"); b1.Property("AppIcon_512") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_AppIcon_512") .HasComment("App-icon-512"); b1.Property("AppleTouchIcon") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_AppleTouchIcon") .HasComment("Apple-touch-icon"); b1.Property("Favicon") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_Favicon") .HasComment("Favicon"); b1.Property("LogoHorizontal") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_LogoHorizontal") .HasComment("Logo-horizontal"); b1.Property("LogoSquare") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_LogoSquare") .HasComment("Logo-square"); b1.Property("OgDefault") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_OgDefault") .HasComment("og-default"); b1.Property("TwitterImage") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Images_TwitterImage") .HasComment("Twitter-image"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.MetaConfig", "Meta", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("Adds") .HasColumnType("nvarchar(max)"); b1.Property("ApplicationName") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_ApplicationName") .HasComment("Meta Application Name"); b1.Property("Author") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Author") .HasComment("Meta Author"); b1.Property("Description") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Description") .HasComment("Meta Description"); b1.Property("Generator") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Generator") .HasComment("Meta Generator"); b1.Property("Keywords") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Keywords") .HasComment("Meta Keywords"); b1.Property("Robots") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Robots") .HasComment("Meta Robots"); b1.Property("Viewport") .HasMaxLength(255) .HasColumnType("nvarchar(255)") .HasColumnName("Meta_Viewport") .HasComment("Meta Viewport"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.PaperConfig", "Paper", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("Enabled") .HasColumnType("bit") .HasColumnName("Paper_Enabled") .HasComment("모의투자 활성화"); b1.Property("FeeRateBp") .HasColumnType("int") .HasColumnName("Paper_FeeRateBp") .HasComment("매매 수수료 Bp"); b1.Property("MaxHolding") .HasColumnType("int") .HasColumnName("Paper_MaxHolding") .HasComment("계좌 최대 보유 토큰 (0=무제한)"); b1.Property("MinDeposit") .HasColumnType("int") .HasColumnName("Paper_MinDeposit") .HasComment("최소 입금 토큰"); b1.Property("MinFillsForRank") .HasColumnType("int") .HasColumnName("Paper_MinFillsForRank") .HasComment("리더보드 등재 최소 체결 수"); b1.Property("OrderMaxPctBp") .HasColumnType("int") .HasColumnName("Paper_OrderMaxPctBp") .HasComment("1주문 상한 Bp"); b1.Property("TaxRateBp") .HasColumnType("int") .HasColumnName("Paper_TaxRateBp") .HasComment("매도 거래세 Bp"); b1.Property("WithdrawProfitBurnBp") .HasColumnType("int") .HasColumnName("Paper_WithdrawProfitBurnBp") .HasComment("출금 수익분 소각 Bp"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.RewardConfig", "Reward", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("ChatDailyCount") .HasColumnType("int") .HasColumnName("Reward_ChatDailyCount") .HasComment("채팅 보상 일일 횟수 상한 (0=무제한)"); b1.Property("ChatDailyExp") .HasColumnType("int") .HasColumnName("Reward_ChatDailyExp") .HasComment("채팅 보상 일일 경험치 상한 (0=무제한)"); b1.Property("CheerDailyMax") .HasColumnType("int"); b1.Property("CheerFeePercent") .HasColumnType("int"); b1.Property("CheerMinAmount") .HasColumnType("int"); b1.Property("CommentDailyCount") .HasColumnType("int") .HasColumnName("Reward_CommentDailyCount") .HasComment("댓글 보상 일일 횟수 상한 (0=무제한)"); b1.Property("CommentDailyExp") .HasColumnType("int") .HasColumnName("Reward_CommentDailyExp") .HasComment("댓글 보상 일일 경험치 상한 (0=무제한)"); b1.Property("CommentDailyPoint") .HasColumnType("int") .HasColumnName("Reward_CommentDailyPoint") .HasComment("댓글 보상 일일 토큰 상한 (0=무제한)"); b1.Property("CommentExp") .HasColumnType("int") .HasColumnName("Reward_CommentExp") .HasComment("댓글 작성 지급 경험치"); b1.Property("CommentPoint") .HasColumnType("int") .HasColumnName("Reward_CommentPoint") .HasComment("댓글 작성 지급 토큰"); b1.Property("LikeGivenDailyCount") .HasColumnType("int") .HasColumnName("Reward_LikeGivenDailyCount") .HasComment("추천(누른 쪽) 보상 일일 횟수 상한 (0=무제한)"); b1.Property("LikeGivenDailyExp") .HasColumnType("int") .HasColumnName("Reward_LikeGivenDailyExp") .HasComment("추천(누른 쪽) 보상 일일 경험치 상한 (0=무제한)"); b1.Property("LikeGivenExp") .HasColumnType("int") .HasColumnName("Reward_LikeGivenExp") .HasComment("추천(누른 쪽) 지급 경험치"); b1.Property("LikeReceivedDailyCount") .HasColumnType("int") .HasColumnName("Reward_LikeReceivedDailyCount") .HasComment("추천(받은 쪽) 보상 일일 횟수 상한 (0=무제한)"); b1.Property("LikeReceivedDailyPoint") .HasColumnType("int") .HasColumnName("Reward_LikeReceivedDailyPoint") .HasComment("추천(받은 쪽) 보상 일일 토큰 상한 (0=무제한)"); b1.Property("LikeReceivedPoint") .HasColumnType("int") .HasColumnName("Reward_LikeReceivedPoint") .HasComment("추천(받은 쪽) 지급 토큰"); b1.Property("MinCommentLength") .HasColumnType("int") .HasColumnName("Reward_MinCommentLength") .HasComment("보상 지급 최소 댓글 길이 (0=제한 없음)"); b1.Property("MinPostLength") .HasColumnType("int") .HasColumnName("Reward_MinPostLength") .HasComment("보상 지급 최소 게시글 길이 (0=제한 없음)"); b1.Property("NewMemberHoldDays") .HasColumnType("int") .HasColumnName("Reward_NewMemberHoldDays") .HasComment("신규 회원 보상 유예 기간(일, 0=유예 없음)"); b1.Property("PostDailyCount") .HasColumnType("int") .HasColumnName("Reward_PostDailyCount") .HasComment("게시글 보상 일일 횟수 상한 (0=무제한)"); b1.Property("PostDailyExp") .HasColumnType("int") .HasColumnName("Reward_PostDailyExp") .HasComment("게시글 보상 일일 경험치 상한 (0=무제한)"); b1.Property("PostDailyPoint") .HasColumnType("int") .HasColumnName("Reward_PostDailyPoint") .HasComment("게시글 보상 일일 토큰 상한 (0=무제한)"); b1.Property("PostExp") .HasColumnType("int") .HasColumnName("Reward_PostExp") .HasComment("게시글 작성 지급 경험치"); b1.Property("PostPoint") .HasColumnType("int") .HasColumnName("Reward_PostPoint") .HasComment("게시글 작성 지급 토큰"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.OwnsOne("Domain.Entities.Common.SignupRewardConfig", "SignupReward", b1 => { b1.Property("ConfigID") .HasColumnType("int"); b1.Property("CashAmount") .HasColumnType("int") .HasColumnName("SignupReward_CashAmount") .HasComment("지급 캐시 (Adjusted)"); b1.Property("CoinAmount") .HasColumnType("int") .HasColumnName("SignupReward_CoinAmount") .HasComment("지급 코인 (Airdrop)"); b1.Property("Enabled") .HasColumnType("bit") .HasColumnName("SignupReward_Enabled") .HasComment("가입 축하 보상 활성화"); b1.Property("ExpAmount") .HasColumnType("int") .HasColumnName("SignupReward_ExpAmount") .HasComment("지급 경험치"); b1.HasKey("ConfigID"); b1.ToTable("Config"); b1.WithOwner() .HasForeignKey("ConfigID"); }); b.Navigation("Account") .IsRequired(); b.Navigation("Attendance") .IsRequired(); b.Navigation("Basic") .IsRequired(); b.Navigation("ChatExp") .IsRequired(); b.Navigation("Company") .IsRequired(); b.Navigation("Crypto") .IsRequired(); b.Navigation("EmailTemplate") .IsRequired(); b.Navigation("External") .IsRequired(); b.Navigation("Images") .IsRequired(); b.Navigation("Meta") .IsRequired(); b.Navigation("Paper") .IsRequired(); b.Navigation("Reward") .IsRequired(); b.Navigation("SignupReward") .IsRequired(); }); modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedBookmark") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedComment") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Feed.FeedComment", "Parent") .WithMany("Children") .HasForeignKey("ParentID") .OnDelete(DeleteBehavior.Restrict); b.Navigation("FeedPost"); b.Navigation("Member"); b.Navigation("Parent"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b => { b.HasOne("Domain.Entities.Feed.FeedComment", "FeedComment") .WithMany("FeedCommentLike") .HasForeignKey("FeedCommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany() .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedComment"); b.Navigation("FeedPost"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedLike") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedPostImage") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedPostMedia") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedPostMention") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b => { b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost") .WithMany("FeedPostTag") .HasForeignKey("FeedPostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Feed.FeedTag", "FeedTag") .WithMany("FeedPostTag") .HasForeignKey("FeedTagID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FeedPost"); b.Navigation("FeedTag"); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b => { b.HasOne("Domain.Entities.Forum.Boards.BoardGroup", "BoardGroup") .WithMany("Board") .HasForeignKey("BoardGroupID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("BoardGroup"); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany("BoardManager") .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", null) .WithOne("BoardMeta") .HasForeignKey("Domain.Entities.Forum.Boards.BoardMeta", "BoardID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaComment", "Comment", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("AllowDeleteProtection") .HasColumnType("bit") .HasColumnName("Comment_AllowDeleteProtection"); b1.Property("AllowDisLike") .HasColumnType("bit") .HasColumnName("Comment_AllowDisLike"); b1.Property("AllowLike") .HasColumnType("bit") .HasColumnName("Comment_AllowLike"); b1.Property("AllowSecret") .HasColumnType("bit") .HasColumnName("Comment_AllowSecret"); b1.Property("AllowUpdateProtection") .HasColumnType("bit") .HasColumnName("Comment_AllowUpdateProtection"); b1.Property("BlameHideCount") .HasColumnType("int") .HasColumnName("Comment_BlameHideCount"); b1.Property("ContentPlaceholder") .HasColumnType("nvarchar(max)") .HasColumnName("Comment_ContentPlaceholder"); b1.Property("DeleteProtectionDays") .HasColumnType("int") .HasColumnName("Comment_DeleteProtectionDays"); b1.Property("EnableComment") .HasColumnType("bit") .HasColumnName("Comment_EnableComment"); b1.Property("EnableCommentUpdateLog") .HasColumnType("bit") .HasColumnName("Comment_EnableCommentUpdateLog"); b1.Property("EnableEditor") .HasColumnType("bit") .HasColumnName("Comment_EnableEditor"); b1.Property("MaxContentLength") .HasColumnType("int") .HasColumnName("Comment_MaxContentLength"); b1.Property("MinContentLength") .HasColumnType("int") .HasColumnName("Comment_MinContentLength"); b1.Property("PerPage") .HasColumnType("int") .HasColumnName("Comment_PerPage"); b1.Property("ShowMemberIcon") .HasColumnType("bit") .HasColumnName("Comment_ShowMemberIcon"); b1.Property("ShowMemberThumb") .HasColumnType("bit") .HasColumnName("Comment_ShowMemberThumb"); b1.Property("UpdateProtectionDays") .HasColumnType("int") .HasColumnName("Comment_UpdateProtectionDays"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaExp", "Exp", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("CommentWriteExp") .HasColumnType("int") .HasColumnName("Exp_CommentWriteExp"); b1.Property("CommentWriteExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_CommentWriteExpWithinDays"); b1.Property("CommentWriteUndoExp") .HasColumnType("int") .HasColumnName("Exp_CommentWriteUndoExp"); b1.Property("EnableExp") .HasColumnType("bit") .HasColumnName("Exp_EnableExp"); b1.Property("FileDownloadExp") .HasColumnType("smallint") .HasColumnName("Exp_FileDownloadExp"); b1.Property("FileUploadExp") .HasColumnType("int") .HasColumnName("Exp_FileUploadExp"); b1.Property("FileUploadExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_FileUploadExpWithinDays"); b1.Property("FileUploadUndoExp") .HasColumnType("int") .HasColumnName("Exp_FileUploadUndoExp"); b1.Property("OtherCommentDisLikeExp") .HasColumnType("int") .HasColumnName("Exp_OtherCommentDisLikeExp"); b1.Property("OtherCommentDisLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OtherCommentDisLikeExpWithinDays"); b1.Property("OtherCommentDisLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OtherCommentDisLikeUndoExp"); b1.Property("OtherCommentLikeExp") .HasColumnType("int") .HasColumnName("Exp_OtherCommentLikeExp"); b1.Property("OtherCommentLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OtherCommentLikeExpWithinDays"); b1.Property("OtherCommentLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OtherCommentLikeUndoExp"); b1.Property("OtherPostDisLikeExp") .HasColumnType("int") .HasColumnName("Exp_OtherPostDisLikeExp"); b1.Property("OtherPostDisLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OtherPostDisLikeExpWithinDays"); b1.Property("OtherPostDisLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OtherPostDisLikeUndoExp"); b1.Property("OtherPostLikeExp") .HasColumnType("int") .HasColumnName("Exp_OtherPostLikeExp"); b1.Property("OtherPostLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OtherPostLikeExpWithinDays"); b1.Property("OtherPostLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OtherPostLikeUndoExp"); b1.Property("OtherPostReadExp") .HasColumnType("smallint") .HasColumnName("Exp_OtherPostReadExp"); b1.Property("OtherPostReadExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OtherPostReadExpWithinDays"); b1.Property("OtherPostReadUndoExp") .HasColumnType("int") .HasColumnName("Exp_OtherPostReadUndoExp"); b1.Property("OwnCommentDisLikeExp") .HasColumnType("smallint") .HasColumnName("Exp_OwnCommentDisLikeExp"); b1.Property("OwnCommentDisLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OwnCommentDisLikeExpWithinDays"); b1.Property("OwnCommentDisLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OwnCommentDisLikeUndoExp"); b1.Property("OwnCommentLikeExp") .HasColumnType("int") .HasColumnName("Exp_OwnCommentLikeExp"); b1.Property("OwnCommentLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OwnCommentLikeExpWithinDays"); b1.Property("OwnCommentLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OwnCommentLikeUndoExp"); b1.Property("OwnPostDisLikeExp") .HasColumnType("smallint") .HasColumnName("Exp_OwnPostDisLikeExp"); b1.Property("OwnPostDisLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OwnPostDisLikeExpWithinDays"); b1.Property("OwnPostDisLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OwnPostDisLikeUndoExp"); b1.Property("OwnPostLikeExp") .HasColumnType("int") .HasColumnName("Exp_OwnPostLikeExp"); b1.Property("OwnPostLikeExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OwnPostLikeExpWithinDays"); b1.Property("OwnPostLikeUndoExp") .HasColumnType("int") .HasColumnName("Exp_OwnPostLikeUndoExp"); b1.Property("OwnPostReadExp") .HasColumnType("int") .HasColumnName("Exp_OwnPostReadExp"); b1.Property("OwnPostReadExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_OwnPostReadExpWithinDays"); b1.Property("OwnPostReadUndoExp") .HasColumnType("int") .HasColumnName("Exp_OwnPostReadUndoExp"); b1.Property("PostWriteExp") .HasColumnType("int") .HasColumnName("Exp_PostWriteExp"); b1.Property("PostWriteExpWithinDays") .HasColumnType("int") .HasColumnName("Exp_PostWriteExpWithinDays"); b1.Property("PostWriteUndoExp") .HasColumnType("int") .HasColumnName("Exp_PostWriteUndoExp"); b1.Property("ShowExpGuide") .HasColumnType("bit") .HasColumnName("Exp_ShowExpGuide"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaGeneral", "General", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("AllowDeleteProtection") .HasColumnType("bit") .HasColumnName("General_AllowDeleteProtection"); b1.Property("AllowUpdateProtection") .HasColumnType("bit") .HasColumnName("General_AllowUpdateProtection"); b1.Property("DeleteProtectionDays") .HasColumnType("int") .HasColumnName("General_DeleteProtectionDays"); b1.Property("EnableFileDownLog") .HasColumnType("bit") .HasColumnName("General_EnableFileDownLog"); b1.Property("EnableLinkClickLog") .HasColumnType("bit") .HasColumnName("General_EnableLinkClickLog"); b1.Property("EnablePostUpdateLog") .HasColumnType("bit") .HasColumnName("General_EnablePostUpdateLog"); b1.Property("UpdateProtectionDays") .HasColumnType("int") .HasColumnName("General_UpdateProtectionDays"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaList", "List", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("AlwaysShowWriteButton") .HasColumnType("bit") .HasColumnName("List_AlwaysShowWriteButton"); b1.Property("ExceptNotice") .HasColumnType("bit") .HasColumnName("List_ExceptNotice"); b1.Property("ExceptSpeaker") .HasColumnType("bit") .HasColumnName("List_ExceptSpeaker"); b1.Property("FooterContent") .HasColumnType("nvarchar(max)") .HasColumnName("List_FooterContent"); b1.Property("HeaderContent") .HasColumnType("nvarchar(max)") .HasColumnName("List_HeaderContent"); b1.Property("IsHotIcon") .HasColumnType("bit") .HasColumnName("List_IsHotIcon"); b1.Property("IsNewIcon") .HasColumnType("bit") .HasColumnName("List_IsNewIcon"); b1.Property("Layout") .HasColumnType("tinyint") .HasColumnName("List_Layout"); b1.Property("PerPage") .HasColumnType("tinyint") .HasColumnName("List_PerPage"); b1.Property("ShowFooter") .HasColumnType("bit") .HasColumnName("List_ShowFooter"); b1.Property("ShowFooterListView") .HasColumnType("bit") .HasColumnName("List_ShowFooterListView"); b1.Property("ShowHeader") .HasColumnType("bit") .HasColumnName("List_ShowHeader"); b1.Property("Sort") .HasColumnType("tinyint") .HasColumnName("List_Sort"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotify", "Notify", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("CommentWriteNotify") .HasColumnType("tinyint") .HasColumnName("Notify_CommentWriteNotify"); b1.Property("PostWriteNotify") .HasColumnType("tinyint") .HasColumnName("Notify_PostWriteNotify"); b1.Property("ReplyWriteNotify") .HasColumnType("tinyint") .HasColumnName("Notify_ReplyWriteNotify"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotifyTemplate", "NotifyTemplate", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("CommentWriteEmailNotifyContent") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_CommentWriteEmailNotifyContent"); b1.Property("CommentWriteEmailNotifySubject") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_CommentWriteEmailNotifySubject"); b1.Property("PostWriteEmailNotifyContent") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_PostWriteEmailNotifyContent"); b1.Property("PostWriteEmailNotifySubject") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_PostWriteEmailNotifySubject"); b1.Property("ReplyWriteEmailNotifyContent") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifyContent"); b1.Property("ReplyWriteEmailNotifySubject") .HasColumnType("nvarchar(max)") .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifySubject"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaPermission", "Permission", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("BoardAccess") .HasColumnType("smallint") .HasColumnName("Permission_BoardAccess"); b1.Property("CommentView") .HasColumnType("smallint") .HasColumnName("Permission_CommentView"); b1.Property("CommentWrite") .HasColumnType("smallint") .HasColumnName("Permission_CommentWrite"); b1.Property("FileDownload") .HasColumnType("smallint") .HasColumnName("Permission_FileDownload"); b1.Property("FileUpload") .HasColumnType("smallint") .HasColumnName("Permission_FileUpload"); b1.Property("PostView") .HasColumnType("smallint") .HasColumnName("Permission_PostView"); b1.Property("PostWrite") .HasColumnType("smallint") .HasColumnName("Permission_PostWrite"); b1.Property("ReplyWrite") .HasColumnType("smallint") .HasColumnName("Permission_ReplyWrite"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaView", "View", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("AllowBlame") .HasColumnType("bit") .HasColumnName("View_AllowBlame"); b1.Property("AllowBookmark") .HasColumnType("bit") .HasColumnName("View_AllowBookmark"); b1.Property("AllowContentLinkTargetBlank") .HasColumnType("bit") .HasColumnName("View_AllowContentLinkTargetBlank"); b1.Property("AllowDislike") .HasColumnType("bit") .HasColumnName("View_AllowDislike"); b1.Property("AllowLike") .HasColumnType("bit") .HasColumnName("View_AllowLike"); b1.Property("AllowPostUrlCopy") .HasColumnType("bit") .HasColumnName("View_AllowPostUrlCopy"); b1.Property("AllowPostUrlQrCode") .HasColumnType("bit") .HasColumnName("View_AllowPostUrlQrCode"); b1.Property("AllowPrevNextBotton") .HasColumnType("bit") .HasColumnName("View_AllowPrevNextBotton"); b1.Property("AllowPrint") .HasColumnType("bit") .HasColumnName("View_AllowPrint"); b1.Property("AllowSnsShare") .HasColumnType("bit") .HasColumnName("View_AllowSnsShare"); b1.Property("BlameHideCount") .HasColumnType("int") .HasColumnName("View_BlameHideCount"); b1.Property("ShowMemberIcon") .HasColumnType("bit") .HasColumnName("View_ShowMemberIcon"); b1.Property("ShowMemberRegDate") .HasColumnType("bit") .HasColumnName("View_ShowMemberRegDate"); b1.Property("ShowMemberSummary") .HasColumnType("bit") .HasColumnName("View_ShowMemberSummary"); b1.Property("ShowMemberThumb") .HasColumnType("bit") .HasColumnName("View_ShowMemberThumb"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaWrite", "Write", b1 => { b1.Property("BoardMetaID") .HasColumnType("int"); b1.Property("AllowEditor") .HasColumnType("bit") .HasColumnName("Write_AllowEditor"); b1.Property("AllowFile") .HasColumnType("bit") .HasColumnName("Write_AllowFile"); b1.Property("AllowImage") .HasColumnType("bit") .HasColumnName("Write_AllowImage"); b1.Property("AllowMedia") .HasColumnType("bit") .HasColumnName("Write_AllowMedia"); b1.Property("AllowPrefix") .HasColumnType("bit") .HasColumnName("Write_AllowPrefix"); b1.Property("AllowSecret") .HasColumnType("bit") .HasColumnName("Write_AllowSecret"); b1.Property("AllowTag") .HasColumnType("bit") .HasColumnName("Write_AllowTag"); b1.Property("DefaultContent") .HasColumnType("nvarchar(max)") .HasColumnName("Write_DefaultContent"); b1.Property("DefaultSubject") .HasColumnType("nvarchar(max)") .HasColumnName("Write_DefaultSubject"); b1.Property("FileUploadExtension") .HasColumnType("nvarchar(max)") .HasColumnName("Write_FileUploadExtension"); b1.Property("FileUploadLimit") .HasColumnType("tinyint") .HasColumnName("Write_FileUploadLimit"); b1.Property("FileUploadMaxSize") .HasColumnType("int") .HasColumnName("Write_FileUploadMaxSize"); b1.Property("FooterContent") .HasColumnType("nvarchar(max)") .HasColumnName("Write_FooterContent"); b1.Property("HeaderContent") .HasColumnType("nvarchar(max)") .HasColumnName("Write_HeaderContent"); b1.Property("ImageUploadLimit") .HasColumnType("tinyint") .HasColumnName("Write_ImageUploadLimit"); b1.Property("ImageUploadMaxSize") .HasColumnType("int") .HasColumnName("Write_ImageUploadMaxSize"); b1.Property("MediaUploadLimit") .HasColumnType("tinyint") .HasColumnName("Write_MediaUploadLimit"); b1.Property("RequiredPrefix") .HasColumnType("bit") .HasColumnName("Write_RequiredPrefix"); b1.Property("ShowFooter") .HasColumnType("bit") .HasColumnName("Write_ShowFooter"); b1.Property("ShowHeader") .HasColumnType("bit") .HasColumnName("Write_ShowHeader"); b1.Property("TagLimit") .HasColumnType("tinyint") .HasColumnName("Write_TagLimit"); b1.HasKey("BoardMetaID"); b1.ToTable("BoardMeta"); b1.WithOwner() .HasForeignKey("BoardMetaID"); }); b.Navigation("Comment") .IsRequired(); b.Navigation("Exp") .IsRequired(); b.Navigation("General") .IsRequired(); b.Navigation("List") .IsRequired(); b.Navigation("Notify") .IsRequired(); b.Navigation("NotifyTemplate") .IsRequired(); b.Navigation("Permission") .IsRequired(); b.Navigation("View") .IsRequired(); b.Navigation("Write") .IsRequired(); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany("BoardPrefix") .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "MentionMember") .WithMany() .HasForeignKey("MentionMemberID") .OnDelete(DeleteBehavior.SetNull); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Parent") .WithMany("Children") .HasForeignKey("ParentID") .OnDelete(DeleteBehavior.Restrict); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("Comment") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Member"); b.Navigation("MentionMember"); b.Navigation("Parent"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentFile") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentImage") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentLink") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentMedia") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithOne("CommentMention") .HasForeignKey("Domain.Entities.Forum.Comments.CommentMention", "CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentReaction") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentReport") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Board"); b.Navigation("Comment"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b => { b.HasOne("Domain.Entities.Forum.Comments.CommentFile", "CommentFile") .WithMany() .HasForeignKey("CommentFileID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentFileDownLog") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict); b.Navigation("Comment"); b.Navigation("CommentFile"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b => { b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentLinkClickLog") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Comments.CommentLink", "CommentLink") .WithMany() .HasForeignKey("CommentLinkID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict); b.Navigation("Comment"); b.Navigation("CommentLink"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b => { b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment") .WithMany("CommentUpdateLog") .HasForeignKey("CommentID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Comment"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict); b.HasOne("Domain.Entities.Forum.Posts.PostFile", "PostFile") .WithMany() .HasForeignKey("PostFileID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostFileDownLog") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); b.Navigation("Post"); b.Navigation("PostFile"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostLinkClickLog") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.PostLink", "PostLink") .WithMany() .HasForeignKey("PostLinkID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Member"); b.Navigation("Post"); b.Navigation("PostLink"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostUpdateLog") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID"); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany("Post") .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Boards.BoardPrefix", "BoardPrefix") .WithMany() .HasForeignKey("BoardPrefixID") .OnDelete(DeleteBehavior.SetNull); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.SetNull); b.Navigation("Board"); b.Navigation("BoardPrefix"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostBookmark") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b => { b.HasOne("Domain.Entities.Members.Member", "FromMember") .WithMany() .HasForeignKey("FromMemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "ToMember") .WithMany() .HasForeignKey("ToMemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("FromMember"); b.Navigation("Post"); b.Navigation("ToMember"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostFile") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostImage") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostLink") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostMedia") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostReaction") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostReport") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Member"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b => { b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany() .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b => { b.HasOne("Domain.Entities.Forum.Boards.Board", "Board") .WithMany() .HasForeignKey("BoardID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Post", "Post") .WithMany("PostTag") .HasForeignKey("PostID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Forum.Posts.Tag", "Tag") .WithMany("PostTag") .HasForeignKey("TagID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Board"); b.Navigation("Post"); b.Navigation("Tag"); }); modelBuilder.Entity("Domain.Entities.Members.Attendance", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b => { b.HasOne("Domain.Entities.Members.Channel", "Channel") .WithMany() .HasForeignKey("ChannelID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Channel"); }); modelBuilder.Entity("Domain.Entities.Members.Channel", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithOne("Channel") .HasForeignKey("Domain.Entities.Members.Channel", "MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b => { b.HasOne("Domain.Entities.Members.Channel", "Channel") .WithMany() .HasForeignKey("ChannelID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Channel"); }); modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b => { b.HasOne("Domain.Entities.Members.Channel", "Channel") .WithMany() .HasForeignKey("ChannelID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Channel"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b => { b.HasOne("Domain.Entities.Members.BroadcastSession", "BroadcastSession") .WithMany() .HasForeignKey("BroadcastSessionID") .OnDelete(DeleteBehavior.NoAction); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("BroadcastSession"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.SetNull); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.Member", b => { b.HasOne("Domain.Entities.Members.MemberGrade", "MemberGrade") .WithMany() .HasForeignKey("MemberGradeID") .OnDelete(DeleteBehavior.SetNull); b.Navigation("MemberGrade"); }); modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithOne("MemberApprove") .HasForeignKey("Domain.Entities.Members.MemberApprove", "MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b => { b.HasOne("Domain.Entities.Members.Member", null) .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b => { b.HasOne("Domain.Entities.Members.Member", "Followee") .WithMany() .HasForeignKey("FolloweeMemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Follower") .WithMany() .HasForeignKey("FollowerMemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Followee"); b.Navigation("Follower"); }); modelBuilder.Entity("Domain.Entities.Members.MemberItem", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.Product", "Product") .WithMany() .HasForeignKey("ProductID") .OnDelete(DeleteBehavior.Restrict); b.Navigation("Member"); b.Navigation("Product"); }); modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.MemberStats", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithOne("MemberStats") .HasForeignKey("Domain.Entities.Members.MemberStats", "MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithOne() .HasForeignKey("Domain.Entities.Members.MemberTrackRecord", "MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Notes.Note", b => { b.HasOne("Domain.Entities.Members.Member", "Receiver") .WithMany() .HasForeignKey("ReceiverMemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Sender") .WithMany() .HasForeignKey("SenderMemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Receiver"); b.Navigation("Sender"); }); modelBuilder.Entity("Domain.Entities.Notifications.Notification", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b => { b.HasOne("Domain.Entities.Page.Banner.BannerPosition", "BannerPosition") .WithMany("BannerItems") .HasForeignKey("PositionID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("BannerPosition"); }); modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b => { b.HasOne("Domain.Entities.Page.Faq.FaqCategory", "FaqCategory") .WithMany("FaqItems") .HasForeignKey("CategoryID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("FaqCategory"); }); modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b => { b.HasOne("Domain.Entities.Page.Popup.PopupPosition", "PopupPosition") .WithMany("Popups") .HasForeignKey("PositionID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("PopupPosition"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b => { b.HasOne("Domain.Entities.Paper.PaperAccount", "Account") .WithMany() .HasForeignKey("AccountID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Account"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b => { b.HasOne("Domain.Entities.Paper.PaperOrder", "Order") .WithMany() .HasForeignKey("OrderID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Order"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b => { b.HasOne("Domain.Entities.Paper.PaperAccount", "Account") .WithMany() .HasForeignKey("AccountID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Account"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b => { b.HasOne("Domain.Entities.Paper.PaperAccount", "Account") .WithMany() .HasForeignKey("AccountID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Account"); }); modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b => { b.HasOne("Domain.Entities.Paper.PaperAccount", "Account") .WithMany() .HasForeignKey("AccountID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Account"); }); modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder") .WithMany() .HasForeignKey("PaymentOrderID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Member"); b.Navigation("PaymentOrder"); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder") .WithMany() .HasForeignKey("PaymentOrderID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Member"); b.Navigation("PaymentOrder"); }); modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.NoAction); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b => { b.HasOne("Domain.Entities.Stocks.Stock", "Stock") .WithMany() .HasForeignKey("StockID") .OnDelete(DeleteBehavior.NoAction) .IsRequired(); b.Navigation("Stock"); }); modelBuilder.Entity("Domain.Entities.Store.Coupon", b => { b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany() .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Store.Product", "Product") .WithMany() .HasForeignKey("ProductID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Game"); b.Navigation("Product"); }); modelBuilder.Entity("Domain.Entities.Store.CouponCode", b => { b.HasOne("Domain.Entities.Store.Coupon", "Coupon") .WithMany() .HasForeignKey("CouponID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "IssuedToMember") .WithMany() .HasForeignKey("IssuedToMemberID") .OnDelete(DeleteBehavior.NoAction); b.Navigation("Coupon"); b.Navigation("IssuedToMember"); }); modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b => { b.HasOne("Domain.Entities.Store.GameCategory", "GameCategory") .WithMany("GameCategoryMap") .HasForeignKey("GameCategoryID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany("GameCategoryMap") .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Game"); b.Navigation("GameCategory"); }); modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b => { b.HasOne("Domain.Entities.Store.GameGenre", "GameGenre") .WithMany("GameGenreMap") .HasForeignKey("GameGenreID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany("GameGenreMap") .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Game"); b.Navigation("GameGenre"); }); modelBuilder.Entity("Domain.Entities.Store.GameImage", b => { b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany("GameImage") .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Game"); }); modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b => { b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany("GameLanguageSupport") .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.GameLanguage", "GameLanguage") .WithMany("GameLanguageSupport") .HasForeignKey("GameLanguageID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Game"); b.Navigation("GameLanguage"); }); modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b => { b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany() .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Game"); }); modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b => { b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode") .WithMany() .HasForeignKey("CouponCodeID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem") .WithMany() .HasForeignKey("OrderItemID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("CouponCode"); b.Navigation("Member"); b.Navigation("OrderItem"); }); modelBuilder.Entity("Domain.Entities.Store.Order", b => { b.HasOne("Domain.Entities.Members.Channel", "Channel") .WithMany() .HasForeignKey("ChannelID") .OnDelete(DeleteBehavior.NoAction); b.HasOne("Domain.Entities.Members.Member", "Member") .WithMany() .HasForeignKey("MemberID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("Channel"); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Store.OrderItem", b => { b.HasOne("Domain.Entities.Store.CouponCode", "IssuedCouponCode") .WithMany() .HasForeignKey("IssuedCouponCodeID") .OnDelete(DeleteBehavior.NoAction); b.HasOne("Domain.Entities.Store.Order", "Order") .WithMany("Items") .HasForeignKey("OrderID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("Domain.Entities.Store.Product", "Product") .WithMany() .HasForeignKey("ProductID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.Navigation("IssuedCouponCode"); b.Navigation("Order"); b.Navigation("Product"); }); modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b => { b.HasOne("Domain.Entities.Store.Order", "Order") .WithMany("Refunds") .HasForeignKey("OrderID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Order"); }); modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b => { b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode") .WithMany() .HasForeignKey("CouponCodeID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem") .WithMany() .HasForeignKey("OrderItemID") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); b.HasOne("Domain.Entities.Store.OrderRefund", "OrderRefund") .WithMany("Items") .HasForeignKey("OrderRefundID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("CouponCode"); b.Navigation("OrderItem"); b.Navigation("OrderRefund"); }); modelBuilder.Entity("Domain.Entities.Store.Product", b => { b.HasOne("Domain.Entities.Store.Game", "Game") .WithMany() .HasForeignKey("GameID") .OnDelete(DeleteBehavior.Restrict); b.Navigation("Game"); }); modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b => { b.HasOne("Domain.Entities.Store.Product", "Product") .WithOne() .HasForeignKey("Domain.Entities.Store.ProductLimitConfig", "ProductID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Product"); }); modelBuilder.Entity("Domain.Entities.Store.Shipment", b => { b.HasOne("Domain.Entities.Store.Order", "Order") .WithOne() .HasForeignKey("Domain.Entities.Store.Shipment", "OrderID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Order"); }); modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b => { b.HasOne("Domain.Entities.Members.Member", "Member") .WithOne("Wallet") .HasForeignKey("Domain.Entities.Wallets.Wallet", "MemberID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Member"); }); modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b => { b.HasOne("Domain.Entities.Wallets.Wallet", null) .WithMany("Balances") .HasForeignKey("WalletKey") .HasPrincipalKey("WalletKey") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 => { b1.Property("WalletBalanceID") .HasColumnType("int"); b1.Property("Currency") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasColumnName("Currency"); b1.Property("Value") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasColumnName("Amount"); b1.HasKey("WalletBalanceID"); b1.ToTable("WalletBalance"); b1.WithOwner() .HasForeignKey("WalletBalanceID"); }); b.Navigation("Amount") .IsRequired(); }); modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b => { b.HasOne("Domain.Entities.Wallets.Wallet", "Wallet") .WithMany("Transactions") .HasForeignKey("WalletKey") .HasPrincipalKey("WalletKey") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 => { b1.Property("WalletTransactionID") .HasColumnType("int"); b1.Property("Currency") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasColumnName("Currency"); b1.Property("Value") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasColumnName("Amount"); b1.HasKey("WalletTransactionID"); b1.ToTable("WalletTransaction"); b1.WithOwner() .HasForeignKey("WalletTransactionID"); }); b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "BalanceAfter", b1 => { b1.Property("WalletTransactionID") .HasColumnType("int"); b1.Property("Currency") .IsRequired() .HasMaxLength(10) .HasColumnType("nvarchar(10)") .HasColumnName("BalanceAfterCurrency"); b1.Property("Value") .HasPrecision(18) .HasColumnType("decimal(18,0)") .HasColumnName("BalanceAfter"); b1.HasKey("WalletTransactionID"); b1.ToTable("WalletTransaction"); b1.WithOwner() .HasForeignKey("WalletTransactionID"); }); b.Navigation("Amount") .IsRequired(); b.Navigation("BalanceAfter") .IsRequired(); b.Navigation("Wallet"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b => { b.Navigation("Children"); b.Navigation("FeedCommentLike"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b => { b.Navigation("FeedBookmark"); b.Navigation("FeedComment"); b.Navigation("FeedLike"); b.Navigation("FeedPostImage"); b.Navigation("FeedPostMedia"); b.Navigation("FeedPostMention"); b.Navigation("FeedPostTag"); }); modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b => { b.Navigation("FeedPostTag"); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b => { b.Navigation("BoardManager"); b.Navigation("BoardMeta") .IsRequired(); b.Navigation("BoardPrefix"); b.Navigation("Post"); }); modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b => { b.Navigation("Board"); }); modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b => { b.Navigation("Children"); b.Navigation("CommentFile"); b.Navigation("CommentFileDownLog"); b.Navigation("CommentImage"); b.Navigation("CommentLink"); b.Navigation("CommentLinkClickLog"); b.Navigation("CommentMedia"); b.Navigation("CommentMention"); b.Navigation("CommentReaction"); b.Navigation("CommentReport"); b.Navigation("CommentUpdateLog"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b => { b.Navigation("Comment"); b.Navigation("PostBookmark"); b.Navigation("PostFile"); b.Navigation("PostFileDownLog"); b.Navigation("PostImage"); b.Navigation("PostLink"); b.Navigation("PostLinkClickLog"); b.Navigation("PostMedia"); b.Navigation("PostReaction"); b.Navigation("PostReport"); b.Navigation("PostTag"); b.Navigation("PostUpdateLog"); }); modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b => { b.Navigation("PostTag"); }); modelBuilder.Entity("Domain.Entities.Members.Member", b => { b.Navigation("Channel"); b.Navigation("MemberApprove") .IsRequired(); b.Navigation("MemberStats") .IsRequired(); b.Navigation("Wallet"); }); modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b => { b.Navigation("BannerItems"); }); modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b => { b.Navigation("FaqItems"); }); modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b => { b.Navigation("Popups"); }); modelBuilder.Entity("Domain.Entities.Store.Game", b => { b.Navigation("GameCategoryMap"); b.Navigation("GameGenreMap"); b.Navigation("GameImage"); b.Navigation("GameLanguageSupport"); }); modelBuilder.Entity("Domain.Entities.Store.GameCategory", b => { b.Navigation("GameCategoryMap"); }); modelBuilder.Entity("Domain.Entities.Store.GameGenre", b => { b.Navigation("GameGenreMap"); }); modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b => { b.Navigation("GameLanguageSupport"); }); modelBuilder.Entity("Domain.Entities.Store.Order", b => { b.Navigation("Items"); b.Navigation("Refunds"); }); modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b => { b.Navigation("Items"); }); modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b => { b.Navigation("Balances"); b.Navigation("Transactions"); }); #pragma warning restore 612, 618 } } }