StockWatch.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// 회원 관심종목 (Member → Stock). d0 §2.1 규약대로 char(6) Code 를 FK 없이 denorm 보관하고 쓰기 시 AnyAsync 로 사전 검증한다.
  5. /// (MemberID, StockCode) UNIQUE — 토글로 등록/해제.
  6. /// </summary>
  7. public sealed class StockWatch
  8. {
  9. [Key]
  10. public long ID { get; private set; }
  11. /// <summary>관심 등록 회원 ID</summary>
  12. public int MemberID { get; private set; }
  13. /// <summary>단축코드 (char 6) — Stock.Code denorm</summary>
  14. public string StockCode { get; private set; } = default!;
  15. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  16. private StockWatch() { }
  17. private StockWatch(int memberID, string stockCode)
  18. {
  19. if (memberID <= 0)
  20. {
  21. throw new ArgumentOutOfRangeException(nameof(memberID));
  22. }
  23. if (stockCode is not { Length: 6 } || stockCode.Any(c => !char.IsAsciiDigit(c)))
  24. {
  25. throw new ArgumentException("stockCode must be 6 digits", nameof(stockCode));
  26. }
  27. MemberID = memberID;
  28. StockCode = stockCode;
  29. CreatedAt = DateTime.UtcNow;
  30. }
  31. public static StockWatch Create(int memberID, string stockCode)
  32. {
  33. return new(memberID, stockCode);
  34. }
  35. }