如何在 Entity Framework Core 中定义外键

How to define foreign Key in Entity Framework Core

我正在尝试实现以下 table 结构,但出现错误 “不能用作实体类型的 属性,因为它被配置为导航。”

谁能帮帮我。

类别:

Id Name
1 cat1
2 cat2
3 cat3
4 cat4

子类别:

Id Category Id Name
1 1 Subcat1
2 1 Subcat2
3 1 Subcat3
1 2 Subcat4
1 3 Subcat5
2 3 Subcat6

项目:

Id CategoryId SubCategoryId Name
1 1 2 item1
2 3 2 item2
3 1 null item3
4 4 null item4
public class Category
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<HrCodeSubType> SubCategories { get; set; }

}

public class SubCategory
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

    [Required]
    public string Name { get; set; }
}

public class Item
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category{ get; set; }


    public int? SubCategoryId { get; set; }
    public virtual SubCategory SubCategory { get; set; }
  }

流利Api

builder.Entity<Item>().HasOne(x => x.SubCategory)
         .WithMany().HasForeignKey(x => new { x.CategoyId, x.SubCategoyId });

只保留项目中的子类别class,因为它已经依赖于类别并且具有一对一关系

public class Item
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    
    public int? SubCategoryId { get; set; }
    public virtual SubCategory SubCategory { get; set; }
  }

如果您使用 net core 5+,则不需要任何流畅的 api,只需将导航 属性 添加到子类别

public class SubCategory
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual Category Category { get; set; }

    [Required]
    public string Name { get; set; }

   public virtual ICollection<Item> Items{ get; set; }

}

public class Category
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<SubCategory> SubCategories { get; set; }

}