我在EntityA和EntityB之间有一个双向的,多对多的关联,我正在使用一个关联类EntityABLink对此进行建模,因为我需要跟踪关系的其他属性。另外,我还有另一个类,它包含对EntityA和EntityB之间特定关系的引用,因此我将关联类视为一个完整的实体。
在EntityA中,我有一个只读属性,它返回一个关联的EntityB对象列表,同样,在EntityB中我有一个只读属性,它返回一个关联的EntityA对象列表。请注意,对于这些属性,我隐藏了通过关联类实现关联的事实。 (我还有专门的方法来更新隐藏实现的关系。)在EntityA和EntityB的幕后,我有EntityABLink类型的私有集合。
由于一张图片胜过千言万语,这就是我到目前为止所描述的内容:
(再次注意,EntityA和EntityB上的公共,只读属性与支持它们的私有成员的类型不同。)
到目前为止,这么好。现在我想使用Fluent NHibernate自动覆盖将这些对象持久化到数据库。谈到映射时,我喜欢用上面这个功能相同的表示来思考上面的内容:
从这个图中可以清楚地看出,我真正需要的是两个双向的一对多关系。
在绘制上述内容时,我认为我需要这样的东西:
在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。”
我的映射一定有问题,但我不确定是什么。有任何想法吗?
答案 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是一个很棒的工具,所以我希望最新版本中的错误得到修复。 :-)