自引用表的导航属性

时间:2017-08-25 20:27:55

标签: c# entity-framework entity-framework-6

假设我有这个类别。

public class Category
{
    public int Id { get; set; }
    public int ParentCategoryId { get; set; }
    public string CategoryName { get; set; }
    public string Description { get; set; }

    public Category ParentCategory { get; set; }
    public List<Category> ChildCategories { get; set; }
}

不知道每个人有多少级别,我会在同一个表格中保留类别,子类别等。 ParentCategoryId是FK。

这是配置自联接表的正确方法吗?

//Navigation
  HasRequired(c => c.ParentCategory)
       .WithMany(c => c.ChildCategories)
       .HasForeignKey(c => c.ParentCategoryId);

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

通过执行以下配置:

//Navigation
HasRequired(c => c.ParentCategory)
    .WithMany(c => c.ChildCategories)
    .HasForeignKey(c => c.ParentCategoryId);

您说每个创建的类别都有父类别,而父类别是必需的。这不起作用,因为根类别没有父类。只有子类别具有父类别。父类别是可选的。如果需要父级,则无法插入根类别。

因此,您需要将ParentCategoryId属性设为可选(使用nullable =&gt; int?),您的实体应如下所示:

public class Category
{
    public int Id { get; set; }
    public int? ParentCategoryId { get; set; }
    public string CategoryName { get; set; }
    public string Description { get; set; }

    public Category ParentCategory { get; set; }
    public List<Category> ChildCategories { get; set; }
}

您的流畅配置应如下所示(请注意我使用HasOptional方法):

HasOptional(c => c.ParentCategory)
    .WithMany(c => c.ChildCategories)
    .HasForeignKey(c => c.ParentCategoryId);