0

У меня есть иерархия категория таблицы, как этотFluent NHibernate Отображение и получение иерархии Таблица

Id int, 
Description varchar(100), 
ParentId int, 
Ordinal int, 
IsActive bit 

Я хочу, чтобы принести все Категории от родителя к ребенку, поэтому, когда я назвал session.get<Category>(id), это уже извлекаться все их дети. Вот моя карта и класс:

class Category 
{ 
    public virtual int Id {get; set;} 
    public virtual string Description {get; set;} 
    public virtual int ParentId {get; set;} 
    public virtual int Ordinal {get; set;} 
    public virtual bool IsActive {get; set;} 
} 

class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Table("TB_CATEGORY"); 
     Id(f => f.Id).GeneratedBy.Native(); 
     Map(f => f.Description); 
     Map(f => f.ParentId); 
     Map(f => f.Ordinal); 
     Map(f => f.IsActive); 
    } 
} 

Я искал так много статей, и я до сих пор путают при использовании их решения, потому что они не говорят мне о структуре таблицы и отображений. Как и этот, от ayende blog, я считаю его хорошим решением, но я не могу следовать ему достаточно хорошо, чтобы применить его в своем проекте. Может ли кто-нибудь дать мне шаг за шагом учебник, чтобы достичь этого? Являются ли мои карты и класс правильными?

ответ

1

используя следующие классы

class Category 
{ 
    public virtual int Id {get; private set;} 
    public virtual string Description {get; set;} 
    public virtual Category Parent {get; set;} 
    public virtual bool IsActive {get; set;} 
    public virtual IList<Category> Children {get; private set;} 

    public override bool Euqals(object obj) 
    { 
     var other = obj as Category; 
     return other != null && (Id == 0) ? ReferenceEquals(other, this) : other.Id == Id; 
    } 

    public override int GetHashCode() 
    { 
     return Id; 
    } 
} 

class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Table("TB_CATEGORY"); 
     Id(f => f.Id).GeneratedBy.Native(); 
     Map(f => f.Description); 
     References(f => f.Parent).Column("ParentId"); 
     HasMany(f => f.Children) 
      .AsList(i => i.Column("Ordinal"))  // let the list have the correct order of child items 
      .KeyColumn("ParentId") 
      .Inverse();    // let the reference maintain the association 
     Map(f => f.IsActive); 
    } 
} 

, то вы можете запросить

var categoriesWithChildrenInitialised = session.QueryOver<Category>() 
    .Fetch(c => c.Children).Eager 
    .List() 
+0

спасибо за отображение и кода класса и есть обеспечить, это действительно поможет мне много, чтобы лучше понять. Но поскольку я пытаюсь выполнить код запроса выше, результат неверен и так много записей было возвращено, и метод AsList больше не принимал строку в качестве аргумента. Я использую NH v3.3, возможно, у меня использовалась другая версия, чем у меня. –

+0

AsList теперь использует лямбда для настройки отображения списка, я исправил код. Я думаю, что результатов слишком много, потому что Equals и GetHashCode ошибочны. Я добавил простую реализацию кода. – Firo

Смежные вопросы