Simple audit using Override Entity Framework SaveChanges()
If you would like to implement a simple audit mechanism for your Entity Framework Entities, this is a good example. let say we will have ModifiedBy, ModifiedOn, CreatedBy, CreatedOn fields populated with logged in user.
Create a EntityBase.cs
public abstract class EntityBase : ICreateEntityBase, IModifyEntityBase { [Required] [Column(TypeName = "datetime")] public DateTime CreatedOn { get; set; } [Required] [StringLength(50)] public string CreatedBy { get; set; } [Required] [Column(TypeName = "datetime")] public DateTime ModifiedOn { get; set; } [Required] [StringLength(50)] public string ModifiedBy { get; set; } } public interface ICreateEntityBase { DateTime CreatedOn { get; set; } string CreatedBy { get; set; } } public interface IModifyEntityBase { DateTime ModifiedOn { get; set; } string ModifiedBy { get; set; } }
each of your entity will inherit this base entity.
public class Question : EntityBase { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int QuestionId { get; set; } public string Caption { get; set; } [Required, StringLength(200)] public string QuestionType { get; set; } }
In your DbContext file set the override method like below.
public override int SaveChanges() { var user = _httpContextAccessor.HttpContext.User; var currentUser = user.Claims.FirstOrDefault(s => s.Type == CityClaimTypes.UserName); UpdateEntityBaseProperties(currentUser, DateTime.Now); var rowsAffected = base.SaveChanges(); return rowsAffected; } private void UpdateEntityBaseProperties(string currentUser, DateTime hoDateTime) { var trackables = ChangeTracker.Entries(); foreach (var item in trackables) { if (item.State == EntityState.Unchanged) continue; if (item.State == EntityState.Modified || item.State == EntityState.Added) { var modifyDataEntity = item.Entity as IModifyEntityBase; if (modifyDataEntity != null) { modifyDataEntity.ModifiedBy = currentUser; modifyDataEntity.ModifiedOn = hoDateTime; } } if (item.State == EntityState.Added) { var createDataEntity = item.Entity as ICreateEntityBase; if (createDataEntity != null) { createDataEntity.CreatedBy = currentUser; createDataEntity.CreatedOn = hoDateTime; } } } }