Entity Framework Code First Self Referencing Child Child with Payload

Próbuję to ustawić za pomocą kodu najpierw w strukturze encji i mam problemy. Aby opisać, co próbuję osiągnąć:

Mieć podmiot produktu. Ten produkt może opcjonalnie zawierać jeden lub więcej powiązanych produktów „podrzędnych”. Produkt może być dzieckiem dla jednego lub więcej produktów macierzystych.

kiedy przechodzę do generowania kontrolera powiązanego z klasą modelu „Produkt”, pojawia się błąd: (zaktualizowany, bardziej szczegółowy kod pasuje poniżej)

 There was an error running the selected code generator:
'Unable to retrieve metadata for 'ProductCatalog.Models.Product'.
 Multiple object sets per type are not supported. The object sets 
'Product' and 'Products' can both contain instances of type
'ProductCatalog.Models.Product'.

oto nie działająca klasa modelu:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ProductCatalog.Models
{
    // Product
    public class Product
    {
        [Key]
        public int ProductId { get; set; } // ProductID (Primary key)
        public string ProductName { get; set; } // ProductName
        public string ProductSku { get; set; } // ProductSKU
        public int BaseQuantity { get; set; } // BaseQuantity
        public decimal BaseCost { get; set; } // BaseCost

        // Reverse navigation
        public virtual ICollection<RelatedProduct> ParentProducts { get; set; } // RelatedProduct.FK_RelatedProductChildID
        public virtual ICollection<RelatedProduct> ChildProducts { get; set; } // RelatedProduct.FK_RelatedProductParentID

        public virtual ICollection<RelatedProduct> RelatedProducts { get; set; }
    }


    // RelatedProduct
    public class RelatedProduct
    {
        [Key, Column(Order = 0)]
        public int ParentId { get; set; } // ParentID
        [Key, Column(Order = 1)]
        public int ChildId { get; set; } // ChildID
        public int Quantity { get; set; } // Quantity
        public bool Required { get; set; } // Required
        public bool Locked { get; set; } // Locked

        // Foreign keys
        public virtual Product ParentProduct { get; set; } //  FK_RelatedProductParentID
        public virtual Product ChildProduct { get; set; } //  FK_RelatedProductChildID
    }

    public class ProductDBContext : DbContext
    {
        public IDbSet<Product> Product { get; set; } // Product
        public IDbSet<RelatedProduct> RelatedProduct { get; set; } // RelatedProduct

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<RelatedProduct>()
                .HasRequired(a => a.ParentProduct)
                .WithMany(b => b.ChildProducts)
                .HasForeignKey(c => c.ParentId) // FK_RelatedProductParentID
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<RelatedProduct>()
                .HasRequired(a => a.ChildProduct)
                .WithMany(b => b.ParentProducts)
                .HasForeignKey(c => c.ChildId); // FK_RelatedProductChildID

        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion