我在一个类中有这个映射:
<class name="Parent">
<set name="Activity" table="ChangeLogs" order-by="ChangeDate desc" cascade="all-delete-orphan">
<key column="RequestID" />
<one-to-many class="ChangeLog" />
</set>
这是另一个:
<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" />
在父级中,在当前事务中加载我添加到集合中:
parent.Activity.Add(new Child(){/* properties, etc */});
然后我提交了交易。对父级的任何更改都会通过更新调用保存到数据库中,但无论级联值如何或者为inverse = true / false / just-save-already,我都无法插入这些子级。我一直在反对它,阅读示例/文档/等等,我不明白为什么它不起作用。我错过了一些简单的事吗?我一直在杀掉服务器并在每次更改后重新构建以确保更新,但是nada。
更糟糕的是,偶尔它有工作,有各种反向值,有时通过将Child = parent添加到子节点,有时通过在添加之前单独保存子节点...然后它稍后退出工作。我很难过o_O
编辑:事情已经明确尝试,因为这是发布,重建+服务器重启之间,没有一个生成插入调用或错误:
<set inverse=true>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=true>
parent.Activity.Add(new Child(){})
<set>
parent.Activity.Add(new Child(){Request=parent})
<set>
parent.Activity.Add(new Child(){})
<set inverse=false>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=false>
parent.Activity.Add(new Child(){})
这确实有效:
<set>
Child c = new Child() {Request = parent};
parent.Activity.Add(c);
Session.Save(c);
但是,如果被忽略,设置级联的重点是什么?
编辑:看了一下这个:http://nhibernate.info/doc/nh/en/index.html#example-parentchild-bidir我试过了:
<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" not-null=true />
上面有6个主要的,没有运气。
答案 0 :(得分:1)
对我而言,一次性正确设置始终是个问题。起初一切看起来都很好,但我真的想知道你在哪一方面设置了反向属性?
此代码适用于我:
<class name="Parent" table="Parent">
<bag name="Languages" inverse="true" cascade="all-delete-orphan" lazy="false" fetch="join">
<key column="parentId" />
<one-to-many class="Language" />
</bag>
<class name="Language" table="Language">
<many-to-one column="parentId" name="Parent" class="Parent" not-null="true" />
我希望这会有所帮助。
答案 1 :(得分:0)
这是正确的映射:
<class name="Parent">
...
<set cascade="all-delete-orphan" inverse="true" ...>
...
</set>
</class>
<class name="Child">
...
<many-to-one .../>
</class>
正确用法(假定已存在的父级):
using (var tx = session.BeginTransaction())
{
var parent = GetParent();
parent.Collection.Add(new Child { Parent = parent });
tx.Commit();
}