有人知道我将如何映射具有相同子类型的两个多对多集合的实体。
我的数据库结构是这样。
“正常”关系将是...。
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中使用,那可能是我的偏爱。但是认为此解决方法应该可以做到。