2

ASP.NET MVC 3에서 카탈로그 프로젝트를 개발하고 EF 코드를 먼저 기존 데이터베이스와 함께 사용하려고합니다. 카테고리 내 데이터베이스에 자체가 가리키는 테이블이 있습니다. 이를 위해 다음 모델 클래스를 작성했습니다. - "모델이 잘못된 경우 정정 해줘"-자체에 대한 외부/탐색 키가있는 Model 클래스로 작업

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가 있기 때문에 이러한 현상이 발생합니다. 이 코드 나 이러한 시나리오에서 작업하는 것을 이해하는 데 도움이되는 리소스로 어떻게 작업 할 것인지 알려주십시오. 목록이나 메뉴 등을 표시하는 것과 같은 위의 모델을 사용하는 모든 종류의 코드가 도움이 될 것입니다.

답변

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에서는 제외됩니다. 중첩 된 범주만큼 많은 inverse 속성을 포함해야합니까? –

2

하는 경우 카테고리의 전체 컬렉션을로드하여이 문제를 해결할 수있는 카테고리가 많지 않습니다. 나는 EF가 당신을 위해 픽스 업을 처리 할 것이므로 모든 관계가 제대로 채워 졌다고 생각합니다.

내가 아는 한이 시나리오를 잘 처리 할 수있는 SQL'ish 데이터베이스/ORM이 없습니다. 자주 사용하는 접근법은 위에서 말한대로 전체 컬렉션을로드 한 다음 수동으로 관계를 수정하는 것입니다. 하지만 EF가 그렇게 할거라고 생각합니다.

기본적으로 당신은 수행해야합니다

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