【问题标题】:ASP.NET Core 2.0 MVC EF One-to-Many and Many-to-Many relationshipASP.NET Core 2.0 MVC EF 一对多和多对多关系
【发布时间】:2018-03-22 21:07:09
【问题描述】:

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

我有以下课程:

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

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; }
}


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

我的班级地图是这样的:

产品图:

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 之间的一对多。
产品(子类别)和类别之间的多对多
Product(Tags) 和 Tag 之间的多对多。

提前致谢。

【问题讨论】:

    标签: asp.net entity-framework many-to-many one-to-many asp.net-core-2.0


    【解决方案1】:

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

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

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

    在产品类中添加

    public virtual Catagory Catagory { get; set; }
    

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

    public virtual ICollection<Catagory> Catagories { get; set; }
    

    【讨论】:

    • 您好 BenCdev,感谢您的回复!是的,我使用的是代码优先方法。在某个时刻,我遇到了很多错误,所以我决定从一个新的解决方案开始。我决定删除到虚拟,因此我听从了你的建议。不幸的是,我无法对其进行测试,因为我无法进行迁移(我有 4 个不同的项目、3 个类库:Data、Repository、Service 和一个名为 Web 的 Core MVC Web 应用程序)。目前,我无法在 Repository 项目中进行迁移(我将默认迁移文件夹和类移至 Repository)。
    猜你喜欢
    • 2018-06-02
    • 2017-10-26
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多