Проектирование самостоятельной ссылки мульти объектов уровня в Entity Framework 6.Проектирование самостоятельной ссылки мульти сущностей на уровне В Entity Framework 6
Давайте предположим, что у меня есть Category
сущность следующим образом:
public class Category
{
public int CategoryId { get; set; }
public int? ParentCategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> SubCategories { get; set; }
public virtual ICollection<Product> Products { get; set; }
public Category()
{
SubCategories = new HashSet<Category>();
Products = new HashSet<Product>();
}
}
И я хотел бы отобразить весь Category
DbSet
со всей иерархией к следующему классу POCO (а в том числе всех возможных уровней подразделов и родительских категории):
public class CategoryView
{
public int Id { get; set; }
public int? ParentCategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public CategoryView ParentCategory { get; set; }
public List<CategoryView> SubCategories { get; set; }
public int ProductCount { get; set; }
public Category()
{
SubCategories = new HashSet<CategoryView>();
}
}
Пожалуйста, имейте в виду, что одна категория может иметь неограниченное число уровней подкатегорий следующим образом:
Category (Level 0)
SubCategory1 (Level 1)
SubCategory2
SubCategory2SubCategory1 (Level 2)
SubCategory2SubCategory2
SubCategory2SubCategory2SubCategory1 (Level 3)
... (Level N)
SubCategory3
Когда пытались создать иерархию с рекурсивного метода, который пытается обработать каждую категорию к югу и родительские категории, получили stackoverflow exception
, поскольку он застревает между первой категорией (Category
) и первой подкатегорией (SubCategory1
) из-за отношения между ParentCategory
и SubCategories
.
Каков наилучший и элегантный способ сделать такую проекцию (без исключения родителей)? (Или есть?)
Любая помощь будет оценена по достоинству.
Спасибо,
Проецируя, вы хотите создать 'IQueryable' или 'IEnumerable ' будет работать? Также не следует, чтобы 'ParentCategory' и' SubCategories' 'CategoryView' ссылались на объекты' CategoryView' (а не 'Category', как в сообщении)? –
IvanStoev, jorgonor да, вы оба правы, скопируйте/вставьте ошибку. Класс POCO должен/должен содержать CategoryView вместо категории. ИванСтоев, хотелось бы иметь IEnumerable, который должен иметь в конце результата проекции. Благодарю. на стороне примечания jorgonor, подход словаря также вызывает ошибку stackoverflow при попытке обработать родительские подкатегории. –
Как я уже сказал, это должен быть тот же словарь для каждого вызова функции. Я предполагаю, что вы вызываете рекурсивную функцию для создания последовательности, каждый вызов функции должен совместно использовать этот экземпляр. Это предотвращает создание новых экземпляров с одинаковым идентификатором. Если у вас нет очень большого набора данных, вы не должны видеть исключение StackOverflowException. – jorgonor