/// <summary>
        /// Adds the specified entity type and any associated entity types recursively to the specified set.
        /// </summary>
        /// <param name="entityType">The entity Type to add.</param>
        /// <param name="entityTypes">The types set to accumulate in.</param>
        /// <param name="metadataProvider">The metadata provider.</param>
        private static void AddEntityType(Type entityType, ICollection<Type> entityTypes, Metadata.MetadataProvider metadataProvider)
        {
            if (entityTypes.Contains(entityType)) {
                // already added this type
                return;
            }

            entityTypes.Add(entityType);
            RegisterDataControllerTypeDescriptionProvider(entityType, metadataProvider);

            if (metadataProvider.IsEntityType(entityType)) {
                TypeDescriptor.GetProperties(entityType)
                              .Cast<PropertyDescriptor>()
                              .Where(pd => pd.HasAttribute<AssociationAttribute>())
                              .Where(TypeUtility.IsDataMember)
                              .Select(pd => TypeUtility.GetElementType(pd.PropertyType))
                              .ForEach(t => AddEntityType(t, entityTypes, metadataProvider));
            }

            // Recursively add any derived entity types specified by [KnownType]
            // attributes
            TypeUtility.GetKnownTypes(entityType, true)
                       .Where(entityType.IsAssignableFrom)
                       .ForEach(t => AddEntityType(t, entityTypes, metadataProvider));
        }