using SmartStack.Domain.Common; using SmartStack.Domain.Support.Events; namespace {{ProjectName}}.Domain.Common; /// /// Extension base entity that adds soft-delete and domain events support /// on top of SmartStack's (which provides Id, /// CreatedAt, UpdatedAt and the ExtensionData JSON bag). /// /// Every scaffolded client entity inherits this class — the package's /// BaseEntity deliberately ships WITHOUT DeletedAt / /// AddDomainEvent, so the extension owns its own lifecycle surface. /// public abstract class ExtensionBaseEntity : BaseEntity { private readonly List _domainEvents = new(); /// /// The package's BaseEntity leaves Id and CreatedAt /// unset at construction (EF assigns them at SaveChanges). Extension /// entities assign both up-front so a factory-created aggregate carries a /// REAL identity before any persistence — its creation domain event can /// reference Id, and domain unit tests can assert identity without /// a DbContext. CoreDbContext.StampAuditFields only fills /// CreatedAt when it is still default, so this stays /// compatible with the persistence pipeline. /// protected ExtensionBaseEntity() { Id = Guid.NewGuid(); CreatedAt = DateTime.UtcNow; } /// Soft-delete marker — scaffolded EF configs filter on DeletedAt == null. public DateTime? DeletedAt { get; protected set; } public IReadOnlyCollection DomainEvents => _domainEvents.AsReadOnly(); protected void AddDomainEvent(IDomainEvent domainEvent) { _domainEvents.Add(domainEvent); } public void ClearDomainEvents() { _domainEvents.Clear(); } }