ASP.NET Core 2.0 MVC EF One-to-Many和Many-to-Many关系

问题描述 投票:1回答:1

在过去的几天里,我一直致力于创建不同类之间的关系。不幸的是,我无法解决它,希望你能进一步帮助我。您可以在下面找到问题定义。

我有以下课程:

  • BaseEntity
  • 产品
  • 类别
  • 标签
  • 产品分类
  • ProductTag

BaseEntity类:

    public class BaseEntity 
    { 
        public long Id { get; set; }
        public DateTime Created { get; set; }
        public DateTime Modified { get; set; }

        public BaseEntity { }
    }

产品类别:

public class Product: BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }


    public long CategoryId { get; set; }
    public virtual Category MainCategory { get; set; }

    public virtual ICollection<ProductSubCategory> ProductSubCategories { get; set; }

    public virtual ICollection<ProductTag> ProductTags { get; set; }
}

分类:

public class Category : BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Product> Products { get; set; }

    public virtual ICollection<ProductSubCategory> ProductSubCategories{ get; set; }

}

标签类:

public class Tag: BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<ProductTag> ProductTags { get; set; }
}

ProductSubCategory类:

public class ProductSubCategory : BaseEntity
{ 
    public long ProductId { get; set; }
    public Product Product{ get; set; }

    public long SubCategoryId { get; set; }
    public Category Category { get; set; }
}

ProductTag类:

public class ProductTag: BaseEntity
{ 
    public long ProductId { get; set; }
    public Product Product{ get; set; }

    public long TagId { get; set; }
    public Tag Tags { get; set; }
}

产品有一个主要类别。 (一到多) 产品可以有许多子类别。 (许多上多) 产品可能有很多标签。 (许多上多)

我的班级地图是这样的:

ProductMap:

public ProductMap(EntityTypeBuilder<Product> entityBuilder)
{
        entityBuilder.HasOne(p => p.MainCategory)
            .WithMany(c => c.Products)
            .HasForeignKey(p => p.CategoryId)
            .OnDelete(DeleteBehavior.SetNull);
}

ProductSubCategoryMap:

  public ProductSubCategoryMap(EntityTypeBuilder<ProductSubCategory> entityBuilder)
    {
        entityBuilder
        .HasKey(psc=> new { psc.ProductId, psc.CategoryId });

        entityBuilder
        .HasOne<Product>(psc => psc.Product)
        .WithMany(p => p.ProductSubCategories)
        .HasForeignKey(psc => psc.ProductId);

        entityBuilder
        .HasOne<Category>(psc=> psc.Category)
        .WithMany(sc => sc.ProductSubCategories)
        .HasForeignKey(psc => psc.CategoryId);;
    }

ProductTagMap:

  public ProductTagMap(EntityTypeBuilder<ProductTag> entityBuilder)
    {
        entityBuilder
            .HasKey(pt => new { pt.ProductId, pt.TagId});

        entityBuilder
            .HasOne<Product>(pt => pt.Product)
            .WithMany(p => p.ProductTags)
            .HasForeignKey(pt=> pt.ProductId);

        entityBuilder
            .HasOne<Tag>(pt => pt.Tag)
            .WithMany(t => t.ProductTags)
            .HasForeignKey(pt => pt.TagId);
    }

我该怎么设置: Product(MainCategory)和Category之间的一对多。 产品(子类别)和类别之间的多对多 产品(标签)和标签之间的多对多。

提前致谢。

asp.net entity-framework many-to-many one-to-many asp.net-core-2.0
1个回答
0
投票

先问几个问题,你是使用代码优先的方法吗?在使用虚拟导航属性时。只是想确定一下。

您目前是否收到任何错误,您尝试了什么,失败了什么?

放置虚拟财产的位置而不是其他模型中的位置,这将为您提供一对多的关系。如果他们在两个模型中,您就可以实现多对多关系。

在Product类中添加

public virtual Catagory Catagory { get; set; }

如果你需要它作为一个集合,那么就像你在其他人中那样添加它,并且可能命名ICollection Catagories而不是单数。

public virtual ICollection<Catagory> Catagories { get; set; }
© www.soinside.com 2019 - 2024. All rights reserved.