using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// 회원 관심종목 (Member → Stock). d0 §2.1 규약대로 char(6) Code 를 FK 없이 denorm 보관하고 쓰기 시 AnyAsync 로 사전 검증한다. /// (MemberID, StockCode) UNIQUE — 토글로 등록/해제. /// public sealed class StockWatch { [Key] public long ID { get; private set; } /// 관심 등록 회원 ID public int MemberID { get; private set; } /// 단축코드 (char 6) — Stock.Code denorm public string StockCode { get; private set; } = default!; public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; private StockWatch() { } private StockWatch(int memberID, string stockCode) { if (memberID <= 0) { throw new ArgumentOutOfRangeException(nameof(memberID)); } if (stockCode is not { Length: 6 } || stockCode.Any(c => !char.IsAsciiDigit(c))) { throw new ArgumentException("stockCode must be 6 digits", nameof(stockCode)); } MemberID = memberID; StockCode = stockCode; CreatedAt = DateTime.UtcNow; } public static StockWatch Create(int memberID, string stockCode) { return new(memberID, stockCode); } }