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