nHibernate HasMany в той же таблице вызывает исключение StackOverflowException - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть объект под названием Category, который содержит много подкатегорий одного и того же объекта (Category):

public class Category : Entity
    {
        public virtual string Name { get; set; }
        public virtual IList<Category> SubCategories { get; set; }
        public virtual Category ParentCategory { get; set; }

        public Category()
        { }

        public Category(Category category)
        {
            SubCategories = category.SubCategories.Where(c => !c.Deleted).Select(c => new Category(c)).ToList();
        }
    }

Вот мое отображение для категории:

public class CategoryMap : NHibernateMap<Category>
    {
        public CategoryMap()
        {
            Map(x => x.Name);
            HasMany(x => x.SubCategories).KeyColumn("ParentId").Cascade.AllDeleteOrphan().AsBag();
            References(x => x.ParentCategory, "ParentId");
        }
    }

Семена базы данныххорошо, и я могу легко добавить новую категорию на верхнем уровне. Но как только я пытаюсь добавить категорию под другую, я получаю следующее исключение:

Процесс прекращается из-за StackOverflowException.

Вот код дляЯ пытаюсь создать категорию:

public Category CreateCategory(CreateCategoryModel model)
        {
            var category = new Category
            {
                Name = model.Name,
            };
            if (model.ParentCategory == null) return category; // Up to here it works fine. - I save the category elsewhere.

            var parent = Get(model.ParentCategory.Id);
            category.ParentCategory = parent;
            parent.SubCategories.Add(category);
            _categoryRepository.SaveOrUpdate(parent);

            return category; // If I hit these lines of code I get the StackOverflow exception
        }

Некоторые указания на то, что я делаю неправильно или как исправить проблему, будут высоко оценены.

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

возможно обратный () может помочь?

HasMany(x => x.SubCategories).KeyColumn("ParentId").Inverse().Cascade.AllDeleteOrphan().AsBag();
0 голосов
/ 07 ноября 2019

Я обнаружил проблему, где происходило 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;
        }
...