流畅的nhibernate – 在同一实体上的多对多关系映射

我在尝试绘制多对多关系时遇到问题,其中关系的两侧都引用同一个实体。 我正在使用Fluent NHibernate和NH3.1。

基本上,情况是这样的 – 我有一个类别,可以有多个父母。 因此,一个类别有多个其他类别作为父类,以及多个其他类别作为其子类。

HasManyToMany(x => x.ParentCategories).AsBag().Table("parentcategorychildren").ParentKeyColumn("ChildID").ChildKeyColumn("ParentID").Cascade.SaveUpdate(); HasManyToMany(x => x.ChildrenCategories).AsBag().Table("parentcategorychildren").ParentKeyColumn("ParentID").ChildKeyColumn("ChildID").Inverse(); 

但是,当我尝试构建工厂时,我收到以下错误:

Category.ChildrenCategories与Category.ChildrenCategories的关系在双方都指定了Inverse。 从关系的一侧移除反向。

我发现奇怪的是为什么它提到Category.ChildrenCategories的“Category.ChildrenCategories”,而不是ParentCategories?

任何帮助将不胜感激 !

我刚刚为此创造了一笔赏金,因为它对我来说非常重要。 拜托,我对“你不能这样做”作为答案不感兴趣。

这很可能是一个FNH错误,很可能已在最新的FNH 源代码中修复。 使用FNH1.0和NH2.1时没有问题。 等效的HBM映射在FNH1.2和NH3.1中运行良好:

         

编辑:在挖掘FNH源代码后,我找到了一个解决方法。 比方说,您的配置如下所示:

 .Mappings(m => { m.FluentMappings.AddFromAssemblyOf(); }) 

这种配置可以抑制不幸的代码:

 .Mappings(m => { var persistenceModel = new PersistenceModel(); persistenceModel.AddMappingsFromAssembly(typeof(Category).Assembly); persistenceModel.ValidationEnabled = false; // this makes the trick m.UsePersistenceModel(persistenceModel); }) 

这是Fluent NHibernate 2.1validation/关系配对的问题。 FNH 将关系配对 ,然后validation只有关系的一侧指定了.Inverse() 。 因为两个引用(父/子)都属于同一个类,所以它们在配对时都是候选匹配。 在这种情况下,FNH 匹配名称相似性 。 因此,他们每个人都与自己配对,而不是彼此配对。 因此,在任一个上放置.Inverse()会触发validation(该对的两侧都是相反的相反关系)。

应该可以使用FluentMappingsContainer上的OverrideBiDirectionalManyToManyPairing()方法来纠正这个问题。 理论上,这将允许您显式配对子关系和父关系。 但是,在FNH 2.1中存在一个错误,并且永远不会调用覆盖回调。 ( 在通过方法设置之前捕获回调值 )。

作为解决方法,您可以禁用FNH中的所有validation。 只有两个validation 。 首先,关系的两边都没有.Inverse() 。 其次,Id映射在每个实体上。 我发现禁用validation的最简洁方法是:

 .Mappings(m => { var persistenceModel = new PersistenceModel() { ValidationEnabled = false }; m.UsePersistenceModel(persistenceModel) .FluentMappings.AddFromAssemblyOf(); }) 

此方法允许您禁用validation,但仍使用FluentMappings配置的完整表现力。

是的,在我看来,这很可能是FNH中的一个错误,因为我直接使用NHibernate进行了测试而没有使用Fluent NH并且它有效。 但是,由于我已经使用FNH建立了一个系统,我不能只是恢复使用它。

我所做的是我自己创建的“中间阶级”,用于多对多关系,通常是自动生成的。 我创建了一个ContentPage_ChildLink页面,该页面链接了ParentsChildren类别。 这让我可以与FNH合作并解决问题:)

基本上,这个ContentPage_ChildLink有两个字段, ChildIDParentID 。 然后,我可以单独设置“反向”关系,没有任何问题。

FNH的问题似乎是当你有一个多对多的关系时,双方是同一个类,我能想到的唯一一个案例就是允许多个父母的层次结构。