private void AddComplexType(Type type, BreezeMetadata metadata)
        {
            if (!_addedTypes.Add(type))
            {
                return;
            }

            var modelConfiguration = _breezeConfigurator.GetModelConfiguration(type);
            var complexType        = new ComplexType(type)
            {
                Custom = modelConfiguration.Custom
            };

            foreach (var property in type.GetProperties())
            {
                if (!_dataTypeProvider.TryGetDataType(property.PropertyType, out var dataType))
                {
                    continue;
                }

                complexType.DataProperties.Add(
                    CreateDataProperty(
                        property.Name,
                        dataType,
                        false,
                        IsNullable(property.PropertyType),
                        false,
                        modelConfiguration.GetMember(property.Name),
                        complexType,
                        null));
            }

            // Add complex types at the beginning of the list
            metadata.StructuralTypes.Insert(0, complexType);
        }
 public static DataType GetDataType(this IDataTypeProvider provider, IType type)
 {
     return(provider.TryGetDataType(type, out var dataType) ? dataType : provider.GetDefaultType());
 }