具有多个相同类型的多对多列表的Nhibernate实体?

时间:2009-12-16 16:40:03

标签: nhibernate fluent-nhibernate nhibernate-mapping

是否有人知道如何使用相同子类型的两个多对多集合映射实体。

我的数据库结构就是这个....

“正常”关系将是....

tbl_Parent
  col_Parent_ID

tbl_Parent_Child_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID

替代关系是......

tbl_Parent
  col_Parent_ID

tbl_Include_ParentChild_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID

实体和映射看起来像这样......

public partial class ParentEntity : AuditableDataEntity<ParentEntity>
{
  public virtual IList<ChildEntity> Children { get; set; }
  public virtual IList<ChildEntity> IncludedChildren { get; set; }
}

public partial class ParentMap : IAutoMappingOverride<ParentEntity>
{
    public void Override(AutoMapping<ParentEntity> mapping)
    {
        mapping.Table("tbl_Parent");

        mapping.HasManyToMany(x => x.Children)
        .Table("tbl_Parent_Child_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();

        mapping.HasManyToMany(x => x.IncludedChildren)
        .Table("tbl_Include_ParentChild_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();
    }
}

我得到的错误是 “System.NotSupportedException:无法弄清楚'儿童'应该是多对多属性的另一面。”

我正在使用NHibernate 2.1.2,FluentNhibernate 1.0。

4 个答案:

答案 0 :(得分:1)

似乎FNH很困惑,因为你似乎把同一个对象(ChildEntity)映射到两个不同的表,如果我没弄错的话。

如果你真的不需要将两个列表分开,可能会为每个列表使用一个区别值来解决问题。例如,您的第一个ChildEntity列表将绑定到discriming值A,并且您可以看到歧视值B.

否则,我可能会选择你的ChildEntity的派生类,只是没有相同的ChildEntity名称。

IList<ChildEntity> ChildEntities
IList<IncludedChildEntity> IncludedChildEntities

你的两个对象类都是同一性的。

如果你说它适用于NH,那么它可能是一个已经说明的错误。但是,您可以将XML映射和AutoMapping与FNH混合使用。所以,如果它在NH中起作用,这可能是我的偏好。但是想想这个解决方法应该这样做。

答案 1 :(得分:0)

你知道我只是在黑暗中拍摄,但这几乎听起来像Hibernate不知道你的ChildEntity类......这通常是我见过那种消息的地方。 Hibernate检查你的类并看到id不知道的引用类(在本例中为ChildEntity)。

也许你已经离开并在此时发现了这个问题,但我想我还是会看到。

答案 2 :(得分:0)

Fluent很困惑,因为您引用了两次相同的父列。这是禁忌。据我所知,从我所看到的活动中可以看出,修复工作不会很快到来。

如果可能的话,您必须编写一些自定义扩展才能使其正常工作。

答案 3 :(得分:-4)

令我很遗憾的是,NHibernate无法做到这一点。考虑使用另一个ORM。