Свободные / NHibernate Коллекции одного и того же класса - PullRequest
4 голосов
/ 16 марта 2010

Я новичок в NHibernate, и у меня возникают проблемы с отображением следующих отношений в этом классе.

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

     public Category()
    {
        this.Name = string.Empty;
        this.SubCategories = new List<Category>();
    }

}

Карты классов (хотя это практически догадки)

public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);

        References(x => x.ParentCategory)
            .Nullable()
            .Not.LazyLoad();

        HasMany(x => x.SubCategories)
            .Cascade.All();

    }
}

Каждая категория может иметь родительскую категорию, некоторые категории имеют много подкатегорий и т. Д. И т. Д. Я могу получить категорию для сохранения правильно (правильные подкатегории и родительская категория fk существуют в базе данных), но при загрузке она возвращает себя в качестве родительской категории.

Я использую Fluent для отображения классов, но если бы кто-то мог указать мне правильное направление для простого NHibernate, это также сработало бы.

Ответы [ 2 ]

4 голосов
/ 30 марта 2010

По соглашению, Fluent NHibernate будет рассматривать «Category_Id» как столбец внешнего ключа. Он не определит ваш столбец "ParentCategoryId". Если вы не переименуете свой самоссылающийся столбец в «Category_Id», вы должны уточнить имя столбца для родительских и дочерних отношений.

Для категории без родителя (абсолютная родительская категория), чей ссылочный столбец равен нулю, разумно возвращать себя в качестве родителя или нуля в зависимости от того, как NHibernate обрабатывает его, так как вы выбираете нетерпеливую загрузку.

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
        Id(x => x.Id); 
        Map(x => x.Name); 

        References(x => x.ParentCategory)
            .Column("ParentCategoryId")    // Many-To-One : parent
            .Nullable() 
            .Not.LazyLoad(); 

        HasMany(x => x.SubCategories) 
           .Cascade.All().Inverse().KeyColumn("ParentCategoryId");   //One-To-Many : chidren

    } 
} 
2 голосов
/ 17 марта 2010

Хорошо, поэтому на HasMany(x=>x.SubCategories) необходимо добавить Inverse() в цепочку вызовов, а также присвоить ей имя столбца, которое, как я предполагаю, является "ParentCategoryId", учитывая сопоставление родительской категории, конечно, это зависит от ваши соглашения тоже.

Если вы опубликуете свою таблицу, я могу дать вам полное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...