EF核心-具有外键的关系和表

时间:2019-03-08 15:06:05

标签: c# asp.net-core-2.1 ef-core-2.1

我正在使用EF Core在ASP.net Core 2.1中制作一个在线购物应用程序。 我的基本模型类是Product,Category和CategoryProduct。我的目标是要有一个单独的表,该表称为带有ProductId和CategoryId的CategoryProduct。 CategoryProduct表应将Product和Category交织在一起,并将ProductId与特定的Category相匹配,反之亦然。

我想创建这些关系:

  • 一个类别可以包含多个产品
  • 一个产品可以属于多个类别

这是我的模型-我在这里仅添加基本属性,而没有任何“显示”或“必需”属性。

public class Product
{
    public Product()
    {           
        CategoryProducts = new List<CategoryProduct>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key()]
    public int ProductId { get; set; }

    public string Code { get; set; }      

    public string Title { get; set; }

    public string Description { get; set; }

    public decimal Price { get; set; }

    public decimal? OldPrice { get; set; }

    public int Stock { get; set; }    

    public virtual ICollection<CategoryProduct> CategoryProducts { get; set; }
}

public class Category
{
    public Category()
    {
        CategoryProducts = new List<CategoryProduct>();
        ChildCategories = new List<Category>();
    }


    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key()]
    public int CategoryId { get; set; }        

    public string Title { get; set; }     

    public int? ParentCategoryId { get; set; }

    [ForeignKey("ParentCategoryId")]
    [InverseProperty("ChildCategories")]
    public virtual Category ParentCategory { get; set; }

    public virtual ICollection<Category> ChildCategories { get; set; }   

   public virtual ICollection<CategoryProduct> CategoryProducts { get; set; }         
}

public class CategoryProduct
{

    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

创建迁移时,将创建表Product,Category和CategoryProduct。我可以在用户界面中添加产品和类别,也可以在数据库中对其进行硬编码,但是在CategoryProduct表中看不到它们。

我重写了OnModelCreating方法,如下所示,并设置了关系,但是没有任何效果。我尝试了很多组合,这似乎应该可以,但不能。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);                     

    builder.Entity<Category>().Property(x => x.CategoryId).ValueGeneratedOnAdd();

    builder.Entity<CategoryProduct>().HasKey(cp => new { cp.CategoryId, cp.ProductId });

    builder.Entity<CategoryProduct>()
        .HasOne(cp => cp.Category)
        .WithMany(c => c.CategoryProducts)
        .HasForeignKey(cp => cp.CategoryId);

    builder.Entity<CategoryProduct>()
        .HasOne(cp => cp.Product)
        .WithMany(p => p.CategoryProducts)
        .HasForeignKey(cp => cp.ProductId);
}

预先感谢您的帮助和答复,我非常感谢他们。

0 个答案:

没有答案