| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Stocks;
- /// <summary>
- /// 회원 관심종목 (Member → Stock). d0 §2.1 규약대로 char(6) Code 를 FK 없이 denorm 보관하고 쓰기 시 AnyAsync 로 사전 검증한다.
- /// (MemberID, StockCode) UNIQUE — 토글로 등록/해제.
- /// </summary>
- public sealed class StockWatch
- {
- [Key]
- public long ID { get; private set; }
- /// <summary>관심 등록 회원 ID</summary>
- public int MemberID { get; private set; }
- /// <summary>단축코드 (char 6) — Stock.Code denorm</summary>
- 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);
- }
- }
|