我在尝试绘制多对多关系时遇到问题,该关系的两端都引用同一实体。我正在使用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);
})