private static IRequiredDataResponse VerifyPreConditions <T>(Entity entity, CRUD.CrudTypes crudFlags)
        {
            Ensure.ArgumentNotNull(nameof(entity), entity);

            var response = new RequiredDataResponse {
                IsError = !VerifyEntity <T>(crudFlags)
            };

            if (!response.IsError)
            {
                return(VerifyEntityProperties(entity, crudFlags));
            }

            response.Message = GetMessageForEntity <T>(crudFlags);
            return(response);
        }
        //TODO: Break this up into smaller methods
        private static IRequiredDataResponse VerifyEntityPropertiesForCreate(Entity entity)
        {
            Ensure.ArgumentNotNull(nameof(entity), entity);

            var response      = new RequiredDataResponse();
            var entityType    = entity.GetType();
            var propertyEntry = entityType.PropertyNamesWithAttribute <RequiredForCreateAttribute>(Properties.IsEnabled, true);

            foreach (var entry in propertyEntry)
            {
                var propertyValue = entityType.GetProperty(entry.Key)?.GetValue(entity, null);
                if (propertyValue == null)
                {
                    response.IsError = true;
                    response.MissingPropertyNames.Add(entry.Key);
                }
                else
                {
                    // check if property is an object that has required fields.
                    if (propertyValue is Entity)
                    {
                        // check the returned list
                        var items       = entry.Value;
                        var subItemList = new Collection <string>();
                        var isSubError  = false;
                        foreach (var item in items)
                        {
                            var subItemValue    = entityType.GetProperty(item)?.GetValue(propertyValue, null);
                            var isNullOrDefault = false;
                            // first check nullable, for any type
                            var propertyType = entityType.GetProperty(item)?.PropertyType;
                            if (propertyType != null)
                            {
                                if (propertyType == typeof(string) ||
                                    propertyType.IsGenericType &&
                                    propertyType.GetGenericTypeDefinition() == typeof(Nullable <>))
                                {
                                    isNullOrDefault = (subItemValue == null);
                                }
                                else
                                {
                                    var objectType = Activator.CreateInstance(propertyType);
                                    isNullOrDefault = objectType.Equals(subItemValue);
                                }
                            }
                            if (isNullOrDefault)
                            {
                                isSubError = true;
                                subItemList.Add(item);
                            }
                        }
                        if (isSubError)
                        {
                            response.IsError = true;
                            response.MissingSubPropertyNames.Add(entry.Key, subItemList);
                        }
                    }
                }
            }
            return(response);
        }