使用关联类的流向NHibernate映射双向,多对多关联

时间:2011-05-22 01:23:41

标签: fluent-nhibernate nhibernate-mapping

我在EntityA和EntityB之间有一个双向的,多对多的关联,我正在使用一个关联类EntityABLink对此进行建模,因为我需要跟踪关系的其他属性。另外,我还有另一个类,它包含对EntityA和EntityB之间特定关系的引用,因此我将关联类视为一个完整的实体。

在EntityA中,我有一个只读属性,它返回一个关联的EntityB对象列表,同样,在EntityB中我有一个只读属性,它返回一个关联的EntityA对象列表。请注意,对于这些属性,我隐藏了通过关联类实现关联的事实。 (我还有专门的方法来更新隐藏实现的关系。)在EntityA和EntityB的幕后,我有EntityABLink类型的私有集合。

由于一张图片胜过千言万语,这就是我到目前为止所描述的内容:
enter image description here

(再次注意,EntityA和EntityB上的公共,只读属性与支持它们的私有成员的类型不同。)

到目前为止,这么好。现在我想使用Fluent NHibernate自动覆盖将这些对象持久化到数据库。谈到映射时,我喜欢用上面这个功能相同的表示来思考上面的内容:
enter image description here 从这个图中可以清楚地看出,我真正需要的是两个双向的一对多关系。

在绘制上述内容时,我认为我需要这样的东西:

在EntityA自动覆盖中:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityBList);

在EntityB自动覆盖中:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityAList);

在EntityABLink自动覆盖中:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable();
mapping.References<EntityB>(x => x.EntityB).Not.Nullable();

然而,当我尝试这个时,我收到以下错误:

“找不到'EntityB'类中属性'_ AssociationList'的getter。”

我的映射一定有问题,但我不确定是什么。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我现在就开始工作了。所以这就是诀窍......我又回到了Fluent NHibernate 1.1版(特别是1.1.0.685)。然后,尽管使用“Reveal.Member”的映射示例没有显示它是必要的,但我将“Access.Field()”添加到EntityA._AssociationList和EntityB._AssociationList的映射中。这是工作映射。

在EntityA自动覆盖中:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityBList);

在EntityB自动覆盖中:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityAList);

在EntityABLink自动覆盖中:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable();
mapping.References<EntityB>(x => x.EntityB).Not.Nullable();

一旦它在FNH 1.1中工作,我尝试升级到FNH 1.2。 不好。我尝试了1.2.0.694以及1.2.0.712,这两个仍然给出了不正确的错误消息,即一个不同的“实体”(实际上是一个枚举) !)没有Id映射。

流利的NHibernate是一个很棒的工具,所以我希望最新版本中的错误得到修复。 :-)