【问题标题】:NHibernate mapping - self referencing: parent and childrenNHibernate 映射 - 自引用:父母和孩子
【发布时间】:2014-08-22 22:11:33
【问题描述】:

我正在尝试拥有这种模型:

public class Activity
{
    public virtual int ID { get; set; }

    public virtual int? ParentID { get; set; }
    public virtual int? RootID { get; set; }

    public virtual Activity Parent { get; set; }
    public virtual Activity Root { get; set; }
    public virtual IList<Activity> Children { get; set; }
}

如果你从结构的角度来看它,它就是一棵树。 根元素没有父元素或根元素,但可能有子元素。 它的任何子节点都必须有父节点和根节点(对于第一级子节点,根 = 父节点)

映射器是这样的:

public class ActivityMap : ClassMapping<Activity>
{
    public ActivityMap()
    {
        Table("activity");
        Lazy(true);
        Id(x => x.ID, map => map.Generator(Generators.Identity));

        ManyToOne(x => x.Root, map => { map.Column("RootID"); map.Cascade(Cascade.All); });

        Bag(x => x.Children,
           mapping =>
           {
               mapping.Inverse(false);
               mapping.Lazy(CollectionLazy.Lazy);
               mapping.Key(k => k.Column("ParentID"));
               mapping.Cascade(Cascade.All);
           },
           mapping => mapping.ManyToMany(map=>map.Class(typeof(Activity)))
           );
    }
}

问题是当我尝试获取孩子时,sql语句看起来像:

SELECT children0_.ParentID as ParentID1_,
children0_.elt as elt1_, 
activity1_.ID as ID55_0_, 
activity1_.TaskID as TaskID55_0_, 
activity1_.ActivityTypeID as Activity3_55_0_, 
activity1_.StateID as StateID55_0_, 
activity1_.Continueforward as Continue5_55_0_, 
activity1_.Ordernumber as Ordernum6_55_0_, 
activity1_.IsDeleted as IsDeleted55_0_, 
activity1_.Created as Created55_0_, 
activity1_.Modified as Modified55_0_, 
activity1_.StartTime as StartTime55_0_, 
activity1_.EndTime as EndTime55_0_, 
activity1_.Progress as Progress55_0_, 
activity1_.RootID as RootID55_0_ 
FROM Children children0_ left outer join activity activity1_ on children0_.elt=activity1_.ID WHERE children0_.ParentID=?
  1. 首先,它似乎在寻找不存在的 Children 表。应该是活动表
  2. 第二:我不确定那个“elt”列是什么......它在任何地方都不存在

有人知道如何制作这个映射吗?

后期编辑: 在回答第二个问题时发现: NHibernate elt field

【问题讨论】:

    标签: nhibernate tree self bag


    【解决方案1】:

    在我以后的编辑中,我得到了第二个问题的答案。

    对于第二个问题,我找到的解决方案是放弃与根实体的关系

    ManyToOne(x => x.Root, map => { map.Column("RootID"); map.Cascade(Cascade.All); });
    

    替换成

    Property(x => x.RootID);
    

    因为我不需要根的整个实体。 我也为这样的儿童换过包:

    Bag(x => x.Children,
               mapping =>
               {
                   mapping.Inverse(false);
                   mapping.Lazy(CollectionLazy.Lazy);
                   mapping.Key(k => k.Column("ParentID"));
                   mapping.Cascade(Cascade.All);
               },
               mapping => mapping.OneToMany()
               );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多