Я обнаружил проблему, где происходило StackOverflowException
. Была рекурсия в подкатегориях> parent> subcategories> parent, создающая бесконечный цикл.
Я не смотрел на подход использования Inverse
, как заявлено @collenbrecht, но я пошел на другой подход, изменив свойнемного структуры данных:
Вместо сохранения всего объекта ParentCategory в категории, я сохраняю только его Id. И я забираю весь объект, когда это необходимо. Это удаляет бесконечный цикл и решает мою проблему.
Моя категория теперь выглядит следующим образом:
public class Category : Entity
{
public virtual string Name { get; set; }
public virtual IList<Category> SubCategories { get; set; } = new List<Category>();
public virtual long? ParentId { get; set; }
public Category()
{ }
public Category(Category category)
{
SubCategories = new List<Category>();
}
}
И отображение выглядит так:
public class CategoryMap : NHibernateMap<Category>
{
public CategoryMap()
{
Map(x => x.Name);
Map(x => x.ParentId);
HasMany(x => x.SubCategories).Cascade.AllDeleteOrphan();
}
}
В моемСлужба я могу сделать следующее:
public Category CreateCategory(CreateCategoryModel model)
{
var category = new Category
{
Name = model.Name,
};
if (model.ParentCategory == null)
{
category.ParentId = null;
return category;
}
var parent = Get(model.ParentCategory.Id);
parent.SubCategories.Add(category);
_categoryRepository.SaveOrUpdate(parent);
category.ParentId = model.ParentCategory.Id;
return category;
}