public void ExcludeDataAnnotation()
        {
            Exclude(o =>
            {
#if EF5 || EF6
                var type       = ObjectContext.GetObjectType(o.GetType());
                var attributes = type.GetCustomAttributes(typeof(AuditExcludeAttribute), true);
#elif EFCORE
                var type       = o.GetType();
                var attributes = type.GetTypeInfo().GetCustomAttributes(typeof(AuditExcludeAttribute), true).ToArray();
#endif

                return(attributes.Length != 0);
            });

            ExcludeIncludePropertyPredicates.Add((o, s) =>
            {
                try
                {
#if EF5 || EF6
                    var type = ObjectContext.GetObjectType(o.GetType());
#elif EFCORE
                    var type = o.GetType();
#endif

                    MemberInfo member = type.GetProperty(s, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);

                    if (member == null)
                    {
                        member = type.GetField(s, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
                    }

                    if (member == null)
                    {
                        return(null);
                    }

#if EF5 || EF6
                    var attributes = member.GetCustomAttributes(typeof(AuditExcludeAttribute), true);
#elif EFCORE
                    var attributes = member.GetCustomAttributes(typeof(AuditExcludeAttribute), true).ToArray();
#endif

                    if (attributes.Length > 0)
                    {
                        return(false);
                    }

                    return(null);
                }
                catch (Exception)
                {
                    return(null);
                }
            });
        }
        /// <summary>
        ///     Includes from the audit selected properties from entities of 'T' type or entities which the
        ///     type derive from 'T'.
        /// </summary>
        /// <typeparam name="T">Generic type to include selected properties.</typeparam>
        /// <param name="propertySelector">The property selector.</param>
        /// <returns>An AuditConfiguration.</returns>
        public AuditConfiguration IncludeProperty <T>(Expression <Func <T, object> > propertySelector)
        {
            var propertyNames = propertySelector.GetPropertyOrFieldAccessors().Select(x => x.ToString()).ToList();

            foreach (var accessor in propertyNames)
            {
                ExcludeIncludePropertyPredicates.Add((x, s) => x is T && s == accessor ? (bool?)true : null);
            }

            return(this);
        }
 /// <summary>
 ///     Includes from the audit all properties from entities of 'T' type or entities which the type
 ///     derive from 'T'.
 /// </summary>
 /// <typeparam name="T">Generic type to include all properties.</typeparam>
 /// <returns>An AuditConfiguration.</returns>
 public AuditConfiguration IncludeProperty <T>()
 {
     ExcludeIncludePropertyPredicates.Add((x, s) => x is T ? (bool?)true : null);
     return(this);
 }
 /// <summary>Includes from the audit all properties.</summary>
 /// <returns>An AuditConfiguration.</returns>
 public AuditConfiguration IncludeProperty()
 {
     ExcludeIncludePropertyPredicates.Add((x, s) => true);
     return(this);
 }