/// <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;
            }
Exemple #4
0
        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);
 }