有人知道我将如何映射具有相同子类型的两个多对多集合的实体。

我的数据库结构是这样。

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

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:无法确定多对多属性'Children'的另一面。

我正在使用NHibernate 2.1.2,FluentNhibernate 1.0。

最佳答案

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

如果您真的不需要将两个列表分开,则可以为每个列表使用一个区分值来解决问题。例如,您的第一个ChildEntity列表将绑定(bind)到区分值A,而您又诱骗到区分值B。

否则,我也许会选择ChildEntity的派生类,只是不要使用相同的ChildEntity名称。

IList<ChildEntity> ChildEntities
IList<IncludedChildEntity> IncludedChildEntities

并且您的两个对象类都是相同的。

如果您说它可以与NH一起使用,那么可能已经是一个错误了。但是,您可以将XML映射和自动映射与FNH混合使用。因此,如果它可以在NH中使用,那可能是我的偏爱。但是认为此解决方法应该可以做到。

07-25 22:35