C# nHibernate在同一个表中有多个导致StackOverflowException
我有一个名为Category的实体,它包含同一实体(Category)的多个子类别: 如果能提供一些我做错了什么或如何解决问题的建议,我将不胜感激 提前谢谢:)也许能帮上忙C# nHibernate在同一个表中有多个导致StackOverflowException,c#,nhibernate,fluent-nhibernate,stack-overflow,C#,Nhibernate,Fluent Nhibernate,Stack Overflow,我有一个名为Category的实体,它包含同一实体(Category)的多个子类别: 如果能提供一些我做错了什么或如何解决问题的建议,我将不胜感激 提前谢谢:)也许能帮上忙 HasMany(x => x.SubCategories).KeyColumn("ParentId").Inverse().Cascade.AllDeleteOrphan().AsBag(); 我发现了发生StackOverflowException的问题。子类别>父类别>子类别>父类别中存在递归,创建了一个无休止的
HasMany(x => x.SubCategories).KeyColumn("ParentId").Inverse().Cascade.AllDeleteOrphan().AsBag();
我发现了发生
StackOverflowException
的问题。子类别>父类别>子类别>父类别中存在递归,创建了一个无休止的循环
我没有像@collenbrecht所说的那样使用Inverse
,但我选择了一种不同的方法,稍微改变了我的数据结构:
我没有在类别上保存整个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 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
}
HasMany(x => x.SubCategories).KeyColumn("ParentId").Inverse().Cascade.AllDeleteOrphan().AsBag();
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;
}