2

我想在ASP.NET MVC 3中开发一个目录项目,并首先在现有数据库中使用EF代码。在我的数据库中有一个分类指向自己的表。为此,我写了下面的模型类。 - “纠正我,如果模型是错误的” -使用具有外部/导航键的模型类

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

问题:我无法理解,我怎么可以用这个类的工作。使用下列代码并将其传递给视图

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

我得到这个错误:对象引用未设置为对象的实例。发生这种情况是因为根类别具有空的ParentCategoryID。请告诉我,您将如何使用此代码或可以帮助我理解在这种情况下工作的任何资源。只要使用上述模型,任何类型的代码都会有帮助,例如显示列表或菜单或其他任何内容,任何内容。

回答

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

然后你找回顶级类别

var topCategories = dbStore.Categories 
    .Where(category => category.ParentCategoryID == null) 
    .Include(category => category.SubCategories).ToList(); 

之后,你可以穿越hierachey

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

    } 

} 
+0

是增加必要InverseProperty对于这种类型的分层数据的工作? 。这种利用类型是否适用于所有类型的场景,如菜单,列表,产品列表和处理类别的每个需求。 –

+1

@Pankaj它不仅适用于分层数据。如果EF无法根据约定找出关系,那么我们必须通过属性或流利的API来明确地配置它们。 – Eranga

+0

我试过这段代码,它工作正常;但它只是一个深层次。深层嵌套类别不在列表中。像:: ** category - subCategory - subsubCategory **。在这个subsubCategory被排除。我是否需要包含与嵌套类别一样多的逆向属性? –

2

如果您没有很多类别可以通过加载整个类别集合来解决。我认为英孚将会为你处理这个问题,这样所有的关系都能正确地填充。

据我所知,没有SQL'ish数据库/ ORM可以很好地处理这种情况。我经常使用的一种方法是按照上面所述加载整个集合,然后手动修复关系。但我认为EF会为你做到这一点。

基本上,你应该做的:

var topCategories = dbStore.Categories.ToList().Where(category => category.ParentCategoryID == null);