Skip to content

Infrastructure.SqlServer to manage audit fields, not domain model #127

@goodtocode

Description

@goodtocode

public override Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
SetAuditFields();
return base.SaveChangesAsync(cancellationToken);
}

private void SetAuditFields()
{
var entries = ChangeTracker.Entries()
.Where(e => IsDomainEntity(e.Entity) &&
(e.State == EntityState.Modified || e.State == EntityState.Added || e.State == EntityState.Deleted));

foreach (var entry in entries)
{
    dynamic entity = entry.Entity;
    if (entry.State == EntityState.Added)
    {
        entity.SetCreatedOn(DateTime.UtcNow);
        entity.SetModifiedOn(null);
        entity.SetDeletedOn(null);
    }
    else if (entry.State == EntityState.Modified)
    {
        entity.SetModifiedOn(DateTime.UtcNow);
        entity.SetDeletedOn(null);
    }
    else if (entry.State == EntityState.Deleted)
    {
        entity.SetDeletedOn(DateTime.UtcNow);
        entry.State = EntityState.Modified;
    }
}

}

private static bool IsDomainEntity(object entity)
{
var type = entity.GetType();
while (type != null)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(DomainEntity<>))
return true;
type = type.BaseType;
}
return false;
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions