Example #1
0
        internal static AuditDbContextConfiguration GetAuditDbContextConfigurationFromXml()
        {
            var auditConfigurationSection = ConfigurationManager.GetSection("entityFramework.Audit") as AuditConfigurationSection ??
                                            new AuditConfigurationSection();

            var entityMapping = new List <AuditTypeInfo>();

            foreach (EntityElement entityElement in auditConfigurationSection.Entities)
            {
                var auditableEntityType = Type.GetType(entityElement.EntityType);
                if (auditableEntityType == null)
                {
                    throw new InvalidOperationException($"Auditable entity type '{entityElement.EntityType}' could not be loaded.");
                }

                var auditEntityType = Type.GetType(entityElement.AuditEntityType);
                if (auditEntityType == null)
                {
                    throw new InvalidOperationException($"Audit entity type '{entityElement.AuditEntityType}' could not be loaded.");
                }

                var auditTypeInfo = new AuditTypeInfo(auditableEntityType, auditEntityType);
                entityMapping.Add(auditTypeInfo);
            }

            return(new AuditDbContextConfiguration(auditConfigurationSection.AuditEnabled, auditConfigurationSection.AuditDateTimeKind, entityMapping.ToArray()));
        }
Example #2
0
        /// <summary>
        ///     Gets a value indicating whether this context is using proxies.
        /// </summary>
        ////public bool Proxies
        ////{
        ////    get
        ////    {
        ////        if (this.auditTypes.Count > 0)
        ////        {
        ////            var f = this.auditTypes.First();
        ////            var e = this.Set(f.Value.AuditableEntityType).Create();
        ////            return e.GetType().Namespace != f.Value.AuditableEntityType.Namespace;
        ////        }

        ////        return this.Database.Configuration.ProxyCreationEnabled;
        ////    }
        ////}

        /// <summary>
        ///     Registers and type for auditing.
        /// </summary>
        /// <param name="auditTypeInfo"></param>
        public void RegisterAuditType(AuditTypeInfo auditTypeInfo)
        {
            lock (this.auditTypes)
            {
                if (auditTypeInfo == null)
                {
                    throw new ArgumentNullException(nameof(auditTypeInfo));
                }

                // Extract the list of propeties to audit.
                var auditEntityType       = auditTypeInfo.AuditEntityType;
                var auditEntityProperties = auditEntityType.GetRuntimeProperties();

                var auditableEntityType       = auditTypeInfo.AuditableEntityType;
                var auditableEntityProperties = auditableEntityType.GetRuntimeProperties().ToDictionary(x => x.Name);

                if (this.auditTypes.ContainsKey(auditableEntityType))
                {
                    throw new ArgumentException($"Type {auditableEntityType.Name} is already registered for auditing.", nameof(auditableEntityType));
                }

                foreach (var property in auditEntityProperties)
                {
                    if (auditableEntityProperties.ContainsKey(property.Name))
                    {
                        if (property.PropertyType == auditableEntityProperties[property.Name].PropertyType)
                        {
                            auditTypeInfo.AuditProperties.Add(property.Name);
                        }
                    }
                }

                this.auditTypes.Add(auditableEntityType, auditTypeInfo);
            }
        }
Example #3
0
        private IAuditEntity AuditEntity(EntityEntry entityEntry, AuditTypeInfo auditTypeInfo, DateTime auditDateTime, string user)
        {
            // Create audit entity.
            var dbSet       = this.Set(auditTypeInfo.AuditEntityType);
            var auditEntity = (IAuditEntity)Activator.CreateInstance(auditTypeInfo.AuditEntityType);
            //dbSet.Add(auditEntity);

            // Copy the properties.
            var auditEntityEntry = this.Entry(auditEntity);

            if (entityEntry.State == EntityState.Added)
            {
                foreach (string propertyName in auditTypeInfo.AuditProperties)
                {
                    auditEntityEntry.Property(propertyName).CurrentValue = entityEntry.Property(propertyName).CurrentValue;
                }
            }
            else
            {
                foreach (string propertyName in auditTypeInfo.AuditProperties)
                {
                    auditEntityEntry.Property(propertyName).CurrentValue = entityEntry.Property(propertyName).OriginalValue;
                }
            }

            // Set the audit columns.
            auditEntityEntry.Property(AuditUpdatedColumnName).CurrentValue = auditDateTime;
            auditEntityEntry.Property(AuditUserColumnName).CurrentValue    = user;
            auditEntityEntry.Property(AuditTypeColumnName).CurrentValue    = entityEntry.State.ToAuditEntityState();

            return(auditEntity);
        }
Example #4
0
        private AuditedEntity AuditEntity(EntityEntry entityEntry, AuditTypeInfo auditTypeInfo, DateTime auditDateTime, string user)
        {
            // Create audit entity.
            dynamic dbSet       = this.Set(auditTypeInfo.AuditEntityType);
            dynamic auditEntity = (IAuditEntity)Activator.CreateInstance(auditTypeInfo.AuditEntityType);

            dbSet.Add(auditEntity);

            // Store all temporary values (e.g. not-yet generated primary keys) for later update
            var temporaryProperties = entityEntry.Properties.Where(p => p.IsTemporary).ToList();

            // Copy the properties.
            var auditEntityEntry = this.Entry(auditEntity);

            if (entityEntry.State == EntityState.Added)
            {
                foreach (var propertyName in auditTypeInfo.AuditProperties)
                {
                    auditEntityEntry.Property(propertyName).CurrentValue = entityEntry.Property(propertyName).CurrentValue;
                }
            }
            else
            {
                foreach (var propertyName in auditTypeInfo.AuditProperties)
                {
                    auditEntityEntry.Property(propertyName).CurrentValue = entityEntry.Property(propertyName).OriginalValue;
                }
            }

            // Set the audit columns.
            auditEntityEntry.Property(AuditUpdatedColumnName).CurrentValue = auditDateTime;
            auditEntityEntry.Property(AuditUserColumnName).CurrentValue    = user;
            auditEntityEntry.Property(AuditTypeColumnName).CurrentValue    = entityEntry.State.ToAuditEntityState();

            return(new AuditedEntity(auditEntity, temporaryProperties));
        }