Menu

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;
                    }
                }

            }
        }

 

Leave a comment