使用nhibernate映射递归关联

时间:2014-04-29 06:53:17

标签: c# .net nhibernate nhibernate-mapping

我有poco class

public class Category : Entity<int>
{
    public virtual Category Parent;
    public virtual Iesi.Collections.Generic.ISet<Article> Articles {get; set;}
    public virtual Iesi.Collections.Generic.ISet<Category> ChildCategories {get; set;}
}

我不确定ChildCategories属性的正确映射

public class CategoryMap : ClassMapping<Category>
{
    public CategoryMap()
    {
       ...
       Set(x => x.ChildCategories,
          c => { c.Cascade(Cascade.DeleteOrphans); },
          r => { r.OneToMany(); }              
       );
    }
}

任何子类别只能有一个父级。这是正确的映射吗? 如果您需要更多信息,请询问。

更新: 以下内容消息是

{"Could not determine type for: xxxx, 
for columns: NHibernate.Mapping.Column(Parent)"}

更新2:

public class CategoryMap : ClassMapping<Category>
    {
        public CategoryMap()
        {
            Id(x => x.Id, m => m.Generator(Generators.GuidComb));

            Property(x => x.Name, m =>
            {
                m.Length(255);
                m.NotNullable(true);
            });

            Property(x => x.Parent, m =>
            {
                //m.NotNullable(true);
            });

            Set(x => x.ChildCategories,
              c => 
              { 
                c.BatchSize(25);
                c.Inverse(true);
                c.Cascade(Cascade.DeleteOrphans); 
                c.Key(k =>
                {
                    k.Column("ParentId");
                });
              },
              r => { r.OneToMany(); }              
           );


            Set(x => x.Articles,
              c => { c.Cascade(Cascade.DeleteOrphans); },
              r => { r.OneToMany(); }
            );            
        }
    }

更新3

Property(x => x.Parent, m =>
            {
                m.Column("ParentId");
                m.NotNullable(true);
            });

错误

{"Could not determine type for: xxxx, 
for columns: NHibernate.Mapping.Column(ParentId)"}

1 个答案:

答案 0 :(得分:4)

不太确定真正的问题是什么,但我对父子集合的标准xml映射看起来像这样:

<set name="ChildCategories" lazy="true"  batch-size="25" inverse="true">
  <key column="ParentId" />
  <one-to-many class="Category"/>
</set>

虽然lazy(据我记得)默认,但我更喜欢明确的陈述

我想说,真正重要的是搜索 Parnet列的信息。我肯定会明确表示。还有反向和批量大小。所以,关注

这可能是集合

的映射
 ...
 Set(x => x.ChildCategories,
      c => 
      { 
        c.BatchSize(25);
        c.Inverse(true);
        c.Cascade(Cascade.DeleteOrphans); 
        c.Key(k =>
        {
            k.Column("ParentId");
        };
      },
      r => { r.OneToMany(); }              
   );

有关为何使用批量调整的更多信息:How to Eager Load Associations without duplication in NHibernate?

因为我们使用(在我的代码片段中)Inverse ...父必须也被映射(并已分配)

更新:此映射的必要部分是映射!

但Parent不是值类型属性。这是一个参考。这就是为什么我们必须像这样映射它:

ManyToOne(x => x.Parent, m =>
{

请参阅:Mapping-by-Code - ManyToOne

我们无法使用

// NOT correct mapping
Property(x => x.Parent