使用具有外部/导航键的Model类

Pan*_*yay 2 entity-relationship hierarchical-data code-first ef-code-first entity-framework-4.1

我正在尝试在ASP.NET MVC 3中开发目录项目,并首先将EF代码与现有数据库一起使用.我的数据库中有一个指向自身的Categories表.为此,我编写了以下模型类. - "如果模型错误,请纠正我" -

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
    public int? ParentCategoryID { get; set; }
    public string CategoryDesc { get; set; }

    [ForeignKey("ParentCategoryID")]
    public virtual Category ParentCategory { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题:我无法理解如何使用本课程.使用并将以下代码传递给视图

var cat = dbStore.Categories.Include("ParentCategory").ToList().

我收到此错误:对象引用未设置为对象的实例.发生这种情况是因为根类别具有null ParentCategoryID.请告诉我您将如何使用此代码或任何可以帮助我理解在这种情况下工作的资源.任何类型的代码都会有用,它使用上面的模型,比如显示列表或菜单或任何东西,只需要任何东西.

Era*_*nga 6

通常你所做的是从顶级类别到底层类别.为了首先执行此操作,您需要SubCategories在类中定义集合

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
    public int? ParentCategoryID { get; set; }
    public string CategoryDesc { get; set; }

    [ForeignKey("ParentCategoryID")]
    public virtual Category ParentCategory { get; set; }

    [InverseProperty("ParentCategory")]
    public virtual ICollection<Category> SubCategories{ get; set; }

    public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后检索顶级类别

var topCategories = dbStore.Categories
   .Where(category => category.ParentCategoryID == null)
   .Include(category => category.SubCategories).ToList();
Run Code Online (Sandbox Code Playgroud)

之后你可以穿越hierachey

foreach(var topCategory in topCategories)
{
    //use top category
    foreach(var subCategory in topCategory.SubCategories)
    {

    }

}
Run Code Online (Sandbox Code Playgroud)