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

基本上,情况就是这样-我有一个类别,可以有多个 parent 。因此,一个类别具有多个其他类别作为父级,以及多个其他类别作为其子级。

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而不是ParentCategories中提到“Category.ChildrenCategories”?

任何帮助将不胜感激 !

我刚刚为此创建了一个赏金,因为它对我来说很重要。拜托,我对“您不能这样做”作为答案不感兴趣。

最佳答案

这很可能是FNH错误,并且很可能已经在最新的FNH source code中修复。使用FNH1.0和NH2.1时没有问题。等效HBM映射在FNH1.2和NH3.1中效果很好:

<bag name="ParentCategories" cascade="all" table="parentcategorychildren">
    <key column="ChildID" />
    <many-to-many column="ParentID" class="Category" />
</bag>

<bag name="ChildrenCategories" inverse="true" table="parentcategorychildren">
    <key column="ParentID" />
    <many-to-many column="ChildID" class="Category" />
</bag>

编辑:
在探究FNH源代码之后,我找到了一种解决方法。假设您的配置如下所示:
.Mappings(m => {
    m.FluentMappings.AddFromAssemblyOf<Category>();
})

不幸的代码可以通过以下配置来抑制:
.Mappings(m => {
    var persistenceModel = new PersistenceModel();
    persistenceModel.AddMappingsFromAssembly(typeof(Category).Assembly);
    persistenceModel.ValidationEnabled = false; // this makes the trick
    m.UsePersistenceModel(persistenceModel);
})

10-06 11:23