1

を使用してTreeMenuを作成する必要がありますNHibernate

これが私が思いついたものです:

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);
        }
    }

作成しているテーブルを調べると、行が 1 つしかなく、列が空ParentIdです。

どうすれば修正できますか、何が間違っていますか?

4

1 に答える 1

0
  • 最初にあなたは.Inverse()hasmanyを逃します。現状では、parentIdを2回保存および更新します
  • すべてのコレクションは読み取り専用である必要があります。NHibernateは、それらを、破棄する追跡および遅延読み込みコレクションに置き換えます。コードをに変更します

    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" });
    
于 2013-03-22T12:40:52.197 に答える