2013-02-27 1 views
1

Мне нужно создать TreeMenu с помощью NHibernate.TreeMenu с самостоятельной ссылкой и вложенным меню

Вот что я cameup с:

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.AppId); 
     Map(x => x.Title); 
     Map(x => x.MaxDepth).Default("3"); 
     Map(x => x.IsActive); 
     References(x => x.Parent).LazyLoad().Column("ParentId"); 

     HasMany(x => x.ChildrenNodes) 
      .LazyLoad() 
      .KeyColumn("ParentId") 
      .Cascade.All(); 

     Table("Category"); 
    } 
} 

public class Category : Node 
{ 
    public virtual string AppId { get; set; } 
    public override string Title { get; set; } 
    public override int MaxDepth { get; set; } 
    public virtual Category Parent { get; set; } 
    public virtual IList<Category> ChildrenNodes { get; set; } 
    public virtual bool IsActive { get; set; } 
} 

public abstract class Node 
{ 
    public virtual long Id { get; set; } 
    public abstract string Title { get; set; } 
    public abstract int MaxDepth { get; set; } 
} 

Вот мой код тестирования:

[Test] 
    public void CreateTableInDb() 
    { 

     using (var db = new FileDatabase(DbFileLocation, true)) 
     { 
      var categoryMenu = new Category 
      { 
       AppId = "1", 
       MaxDepth = 3, 
       IsActive = true, 
       Title = "Services" 
      }; 

      db.Create(categoryMenu); 


      categoryMenu.ChildrenNodes = new List<Category> 
      { 
       new Category 
       { 
        Title = "SubService-Level1", 
        Parent = categoryMenu, 
       } 
      }; 

      db.Update(categoryMenu); 
     } 
    } 

Когда я смотрю в таблицу это создает у меня есть только одна строка, с пустым ParentId колонке ,

Как я могу исправить это и что я делаю неправильно?

+0

ли вы пытаетесь сохранить дочерний узел отдельно, прежде чем добавить его к родителю? –

+0

Мое решение работает как есть, но это не очень хорошо, когда я использую репозиторий, он выравнивает запрос в один список. – IamStalker

ответ

0
  • сначала вы упустите .Inverse() на hasmany. В его нынешнем виде он будет сохранять и обновлять parentId дважды.
  • все коллекции должны быть прочитаны только. NHibernate заменит их отслеживающими и lazyloading коллекциями, которые вы выбрасываете. Измените код на

    public class Category : Node 
    { 
        public Category() 
        { 
         // best practice so that nobody has to null check the collection 
         ChildrenNodes = new List<Category>(); 
        } 
        public virtual IList<Category> ChildrenNodes { get; private set; } 
    
        public void Add(Category subcategory) 
        { 
         subcategory.Parent = this; 
         ChildrenNodes.Add(subcategory); 
        } 
    } 
    
    // in testcode 
    categoryMenu.Add(new Category { Title = "SubService-Level1" }); 
    
Смежные вопросы