Работа с классом Model, имеющим внешний / навигационный ключ - PullRequest
2 голосов
/ 02 октября 2011

Я пытаюсь разработать проект каталога в 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; }
}

Вопрос : Я не могу понять, как я могу работать с этим классом. При использовании и передаче следующего кода в представление

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

Я получил эту ошибку: Ссылка на объект не установлена ​​для экземпляра объекта . Это происходит потому, что корневая категория имеет нулевой ParentCategoryID. Скажите, пожалуйста, как вы будете работать с этим кодом или любым другим ресурсом, который поможет мне понять работу в таких сценариях. Будет полезен любой код, который использует описанную выше модель, например, отображение списка, меню или чего-либо, всего что угодно.

Ответы [ 2 ]

6 голосов
/ 02 октября 2011

Обычно вы путешествуете из категорий верхнего уровня в категории нижнего уровня.Чтобы сделать это сначала, вам нужно определить 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();

После этого вы сможете пройти через иерархию

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

    }

}
2 голосов
/ 05 ноября 2011

Если у вас не так много категорий, вы можете решить эту проблему, загрузив всю коллекцию категорий. Я думаю, что EF справится с вами, так что все отношения будут правильно заполнены.

Насколько я знаю, нет никаких баз данных SQL / ORM, которые могли бы хорошо справиться с этим сценарием. Подход, который я часто использую, состоит в том, чтобы загрузить всю коллекцию, как я уже сказал выше, а затем вручную исправить отношения. Но я думаю, что EF сделает это за вас.

В основном вы должны сделать:

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