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

时间:2011-10-02 13:01:03

标签: entity-framework-4.1 ef-code-first entity-relationship code-first hierarchical-data

我正在尝试在ASP.NET MVC 3中开发目录项目,并首先在现有数据库中使用EF Code。我的数据库中有一个指向自身的 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; }
}

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

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

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

2 个答案:

答案 0 :(得分: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)
    {

    }

}

答案 1 :(得分:2)

如果您没有很多类别,可以通过加载整个类别集合来解决这个问题。我认为EF将为您处理修复程序,以便所有关系都正确填充。

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

基本上你应该这样做:

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