簡體   English   中英

ASP.NET Core 2.0 MVC EF一對多和多對多關系

[英]ASP.NET Core 2.0 MVC EF One-to-Many and Many-to-Many relationship

在最后的日子里,我一直在努力創建不同類之間的關系。 不幸的是,我無法解決,希望您能進一步幫助我。 在下面可以找到問題的定義。

我有以下課程:

  • 基礎實體
  • 產品
  • 類別
  • 標簽
  • 產品分類
  • 產品標簽

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

我該如何設定:
產品(MainCategory)和類別之間一對多。
產品(子類別)和類別之間的多對多
產品(標簽)和標簽之間的多對多。

提前致謝。

首先有幾個問題,您正在使用代碼優先方法嗎? 當您使用虛擬導航屬性時。 只是想確定一下。

您當前遇到任何錯誤嗎?您嘗試了什么?失敗了嗎?

您將虛擬屬性放置在何處而不是放置在其他模型中,將為您帶來一對多的關系。 如果它們在兩個模型中都可以實現多對多關系。

在產品類別中添加

public virtual Catagory Catagory { get; set; }

如果您需要將其作為一個集合,則可以像添加其他集合一樣先添加它,然后將其命名為ICollection Catagories而不是單數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM