0

このような階層カテゴリ テーブルがあります。

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 ブログのように、良い解決策だと思いますが、これを自分のプロジェクトに適用するのに十分に従うことはできません。これを達成するためのステップバイステップのチュートリアルを教えてもらえますか? マッピングとクラスは正しいですか?

4

1 に答える 1

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()
于 2013-06-07T12:36:55.047 に答える