/// <summary> /// Records the change that occurs when a property of an entity is /// modified. /// </summary> /// <param name="entity">The entity that was modified.</param> /// <param name="propertyName"> /// The name of the property that was modified. /// </param> /// <param name="originalValue"> /// The value of the property before it was modified. /// </param> /// <param name="currentValue">The current value of the property.</param> public virtual void RecordChange( IAuditedEntity entity, string propertyName, object originalValue, object currentValue) { modifications.Add(new EntityChange(entity, propertyName, originalValue, currentValue)); }
private void UpdateAudited(IAuditedEntity entity, bool overrideCurrentUser = false) { entity.DatetimeModified = Core.SystemDateTime; if (_user != null && !overrideCurrentUser) { entity.ModifiedBy = _user.UserId; } }
/// <summary> /// Initializes a new instance of the <see cref="EntityChange"/> /// class for the specified entity. /// </summary> /// <param name="entity">The entity that was modified.</param> /// <param name="propertyName"> /// The name of the property that was modified. /// </param> /// <param name="originalValue"> /// The value of the property before it was modified. /// </param> /// <param name="currentValue"> /// The current value of the property. /// </param> public EntityChange( IAuditedEntity entity, string propertyName, object originalValue, object currentValue) { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } Entity = entity; PropertyName = propertyName; OriginalValue = originalValue; CurrentValue = currentValue; }
private void ApplyAuditInfoRules() { // Approach via @julielerman: http://bit.ly/123661P foreach (DbEntityEntry entry in ChangeTracker.Entries() .Where( e => e.Entity is IAuditedEntity && ((e.State == EntityState.Added) || (e.State == EntityState.Modified)))) { IAuditedEntity entity = (IAuditedEntity)entry.Entity; if (entry.State == EntityState.Added) { entity.CreatedOn = DateTime.UtcNow; } else { entity.ModifiedOn = DateTime.UtcNow; } } }
private void HandleAuditableEntities() { string currentUser = Thread.CurrentPrincipal?.Identity?.Name; var entities = ChangeTracker.Entries().Where(x => x.Entity is IAuditedEntity && (x.State == EntityState.Added || x.State == EntityState.Modified)); foreach (var entry in entities) { if (entry.Entity is IAuditedEntity) { IAuditedEntity auditable = ((IAuditedEntity)entry.Entity); if (entry.State == EntityState.Added) { if (auditable.CreationTime == DateTime.MinValue) { auditable.CreationTime = DateTime.Now; auditable.LastModificationTime = auditable.CreationTime; } if (String.IsNullOrEmpty(auditable.CreatorUser)) { auditable.CreatorUser = currentUser; } } else { if (!auditable.LastModificationTime.HasValue) { auditable.LastModificationTime = DateTime.Now; } auditable.LastModifierUser = currentUser; } } } }
private static void RecordChange(this IAuditedContext context, EntityEntry entity, IAuditedEntity auditedEntity) { if (!context.CanAudit()) { return; } switch (entity.State) { case EntityState.Added: foreach (var changeRecorder in context.ChangeRecorders) { changeRecorder.RecordAdd(auditedEntity); } break; case EntityState.Deleted: foreach (var changeRecorder in context.ChangeRecorders) { changeRecorder.RecordDelete(auditedEntity); } break; case EntityState.Modified: foreach (var property in entity.CurrentValues.Properties) { var entry = entity.Property(property.Name); // Note: do not change the line below into `!=`! // `Equals(object, object)` calls an overridden Equals, // whereas `object != object` does not. if (entry.IsModified && !Equals(entry.CurrentValue, entry.OriginalValue)) { foreach (var changeRecorder in context.ChangeRecorders) { changeRecorder.RecordChange(auditedEntity, property.Name, entry.OriginalValue, entry.CurrentValue); } } } break; } }
public override int SaveChanges() { List <AuditReport> tAuditReport = new List <AuditReport>(); foreach (var tEntry in ChangeTracker.Entries()) { if ((tEntry.State == EntityState.Added || tEntry.State == EntityState.Modified || tEntry.State == EntityState.Deleted) && tEntry.Entity is IAuditedEntity) { string entityName = tEntry.Entity.GetType().Name; string entityType = tEntry.State.ToString(); var tempKeyEntity = tEntry.Entity.GetType().GetProperties().Where(x => x.CustomAttributes.Where(y => y.AttributeType.Name == "KeyAttribute").Count() > 0).FirstOrDefault(); string primaryKey = "0"; if (tempKeyEntity != null && tEntry.State != EntityState.Added) { primaryKey = tempKeyEntity.GetValue(tEntry.Entity).ToString(); } if (tEntry.State == EntityState.Deleted) { AuditReport tReport = new AuditReport() { PrimaryKey = primaryKey, EntityName = entityName, Type = entityType }; tAuditReport.Add(tReport); } else { foreach (var prop in tEntry.Properties) { if (tEntry.State == EntityState.Modified && prop.CurrentValue.ToString() == prop.OriginalValue.ToString()) { continue; } AuditReport tReport = new AuditReport() { PrimaryKey = primaryKey, EntityName = entityName, Type = entityType, NewValue = prop.CurrentValue.ToString(), Column = prop.Metadata.Name }; if (tEntry.State == EntityState.Modified) { tReport.OldValue = prop.OriginalValue.ToString(); } tAuditReport.Add(tReport); } } } if (tEntry.State == EntityState.Added) { if (tEntry.Entity is IAuditedEntity) { IAuditedEntity tempEntity = (IAuditedEntity)tEntry.Entity; tempEntity.AddedBy = 1; tempEntity.AddedDate = DateTime.Now; } } else if (tEntry.State == EntityState.Modified) { if (tEntry.Entity is IAuditedEntity) { IAuditedEntity tempEntity = (IAuditedEntity)tEntry.Entity; tempEntity.UpdatedBy = 1; tempEntity.UpdateDate = DateTime.Now; } } else if (tEntry.State == EntityState.Deleted) { tEntry.Reload(); tEntry.State = EntityState.Modified; if (tEntry.Entity is ISoftDelete) { IAuditedEntity tempEntity = (IAuditedEntity)tEntry.Entity; tempEntity.DeletedBy = 1; tempEntity.DeletedDate = DateTime.Now; ISoftDelete softDeleteEntity = (ISoftDelete)tEntry.Entity; tempEntity.IsDeleted = true; } } } AuditReport.AddRange(tAuditReport); return(base.SaveChanges()); }
/// <summary> /// Records the change that occurs when a new entity is added. /// </summary> /// <param name="entity">The entity that was added.</param> public virtual void RecordAdd(IAuditedEntity entity) { additions.Add(entity); }
/// <summary> /// Records the change that occurs when an entity is deleted. /// </summary> /// <param name="entity">The entity that was deleted.</param> public virtual void RecordDelete(IAuditedEntity entity) { deletions.Add(entity); }