Kar*_*sar 20 c# nhibernate entity-relationship many-to-many fluent-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();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试构建工厂时,我收到以下错误:
Category.ChildrenCategories与Category.ChildrenCategories的关系在双方都指定了Inverse.从关系的一侧移除反向.
我发现奇怪的是为什么它将Category.ChildrenCategories提到Category.ChildrenCategories,而不是ParentCategories?
任何帮助将不胜感激 !
我刚刚为此创造了一笔赏金,因为这对我来说非常重要.拜托,我对"你不能这样做"作为答案不感兴趣.
Jak*_*art 12
这很可能是一个FNH错误,它很可能已在最新的FNH 源代码中修复.使用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>
Run Code Online (Sandbox Code Playgroud)
编辑:在挖掘FNH源代码后,我发现了一个解决方法.比方说,您的配置如下所示:
.Mappings(m => {
m.FluentMappings.AddFromAssemblyOf<Category>();
})
Run Code Online (Sandbox Code Playgroud)
此配置可以抑制不幸的代码:
.Mappings(m => {
var persistenceModel = new PersistenceModel();
persistenceModel.AddMappingsFromAssembly(typeof(Category).Assembly);
persistenceModel.ValidationEnabled = false; // this makes the trick
m.UsePersistenceModel(persistenceModel);
})
Run Code Online (Sandbox Code Playgroud)
这是Fluent NHibernate 2.1验证/关系配对的问题.FNH 将关系配对,然后验证只有关系的一侧.Inverse()指定了.因为两个引用(父/子)都属于同一个类,所以它们在配对时都是候选匹配.在这种情况下,FNH 匹配名称相似性.因此,他们每个人都与自己配对而不是彼此配对.因此,放置.Inverse()任何一个触发验证(该对的两侧是相同的关系,这是相反的).
应该可以使用OverrideBiDirectionalManyToManyPairing()FluentMappingsContainer上的方法来纠正这个问题.理论上,这将允许您显式配对子关系和父关系.但是,在FNH 2.1中存在一个错误,并且永远不会调用覆盖回调.(在通过方法设置之前捕获回调值).
作为解决方法,您可以禁用FNH中的所有验证.有只有两个验证.首先,关系的双方都没有.Inverse().其次,Id映射在每个实体上.我发现禁用验证的最简洁方法是:
.Mappings(m => {
var persistenceModel = new PersistenceModel() { ValidationEnabled = false };
m.UsePersistenceModel(persistenceModel)
.FluentMappings.AddFromAssemblyOf<Category>();
})
Run Code Online (Sandbox Code Playgroud)
此方法允许您禁用验证,但仍使用FluentMappings配置的完整表现力.
| 归档时间: |
|
| 查看次数: |
4168 次 |
| 最近记录: |