public static ObjectExtensionInfo MapEfCoreProperty <TProperty>(
     [NotNull] this ObjectExtensionInfo objectExtensionInfo,
     [NotNull] string propertyName,
     [CanBeNull] Action <PropertyBuilder> propertyBuildAction)
 {
     return(objectExtensionInfo.MapEfCoreProperty(
                typeof(TProperty),
                propertyName,
                propertyBuildAction
                ));
 }
 public ObjectExtensionValidationContext(
     [NotNull] ObjectExtensionInfo objectExtensionInfo,
     [NotNull] IHasExtraProperties validatingObject,
     [NotNull] List <ValidationResult> validationErrors,
     [NotNull] ValidationContext validationContext)
 {
     ObjectExtensionInfo = Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo));
     ValidatingObject    = Check.NotNull(validatingObject, nameof(validatingObject));
     ValidationErrors    = Check.NotNull(validationErrors, nameof(validationErrors));
     ValidationContext   = Check.NotNull(validationContext, nameof(validationContext));
 }
        public ObjectExtensionPropertyInfo(
            [NotNull] ObjectExtensionInfo objectExtension,
            [NotNull] Type type,
            [NotNull] string name)
        {
            ObjectExtension = Check.NotNull(objectExtension, nameof(objectExtension));
            Type            = Check.NotNull(type, nameof(type));
            Name            = Check.NotNull(name, nameof(name));

            Configuration = new Dictionary <object, object>();
            Attributes    = new List <Attribute>();
            Validators    = new List <Action <ObjectExtensionPropertyValidationContext> >();

            Attributes.AddRange(ExtensionPropertyHelper.GetDefaultAttributes(Type));
            DefaultValue = TypeHelper.GetDefaultValue(Type);
        }
        public static ObjectExtensionInfo MapEfCoreProperty(
            [NotNull] this ObjectExtensionInfo objectExtensionInfo,
            [NotNull] Type propertyType,
            [NotNull] string propertyName,
            [CanBeNull] Action <PropertyBuilder> propertyBuildAction)
        {
            Check.NotNull(objectExtensionInfo, nameof(objectExtensionInfo));

            return(objectExtensionInfo.AddOrUpdateProperty(
                       propertyType,
                       propertyName,
                       options =>
            {
                options.MapEfCore(
                    propertyBuildAction
                    );
            }
                       ));
        }
        private static void ExecuteCustomObjectValidationActions(
            IHasExtraProperties extensibleObject,
            List <ValidationResult> validationErrors,
            ValidationContext objectValidationContext,
            ObjectExtensionInfo objectExtensionInfo)
        {
            if (!objectExtensionInfo.Validators.Any())
            {
                return;
            }

            var context = new ObjectExtensionValidationContext(
                objectExtensionInfo,
                extensibleObject,
                validationErrors,
                objectValidationContext
                );

            foreach (var validator in objectExtensionInfo.Validators)
            {
                validator(context);
            }
        }
        private static void AddPropertyValidationErrors(
            IHasExtraProperties extensibleObject,
            List <ValidationResult> validationErrors,
            ValidationContext objectValidationContext,
            ObjectExtensionInfo objectExtensionInfo)
        {
            var properties = objectExtensionInfo.GetProperties();

            if (!properties.Any())
            {
                return;
            }

            foreach (var property in properties)
            {
                AddPropertyValidationErrors(
                    extensibleObject,
                    validationErrors,
                    objectValidationContext,
                    property,
                    extensibleObject.GetProperty(property.Name)
                    );
            }
        }
        private static bool CanMapProperty(
            [NotNull] string propertyName,
            [CanBeNull] ObjectExtensionInfo sourceObjectExtension,
            [CanBeNull] ObjectExtensionInfo destinationObjectExtension,
            MappingPropertyDefinitionChecks?definitionChecks = null,
            string[] ignoredProperties = null)
        {
            Check.NotNull(propertyName, nameof(propertyName));

            if (ignoredProperties != null &&
                ignoredProperties.Contains(propertyName))
            {
                return(false);
            }

            if (definitionChecks != null)
            {
                if (definitionChecks.Value.HasFlag(MappingPropertyDefinitionChecks.Source))
                {
                    if (sourceObjectExtension == null)
                    {
                        return(false);
                    }

                    if (!sourceObjectExtension.HasProperty(propertyName))
                    {
                        return(false);
                    }
                }

                if (definitionChecks.Value.HasFlag(MappingPropertyDefinitionChecks.Destination))
                {
                    if (destinationObjectExtension == null)
                    {
                        return(false);
                    }

                    if (!destinationObjectExtension.HasProperty(propertyName))
                    {
                        return(false);
                    }
                }

                return(true);
            }
            else
            {
                var sourcePropertyDefinition      = sourceObjectExtension?.GetPropertyOrNull(propertyName);
                var destinationPropertyDefinition = destinationObjectExtension?.GetPropertyOrNull(propertyName);

                if (sourcePropertyDefinition != null)
                {
                    if (destinationPropertyDefinition != null)
                    {
                        return(true);
                    }

                    if (sourcePropertyDefinition.CheckPairDefinitionOnMapping == false)
                    {
                        return(true);
                    }
                }
                else if (destinationPropertyDefinition != null)
                {
                    if (destinationPropertyDefinition.CheckPairDefinitionOnMapping == false)
                    {
                        return(true);
                    }
                }

                return(false);
            }
        }