![](/img/trans.png)
[英]NHibernate 'Where' Clause causing problems on cascading deletes
[英]NHibernate cascading problems
我在一类中有此映射:
<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-aaveyy,我都无法插入这些子级。 我一直在反对它一段时间,阅读示例/文档/等等,但我看不出为什么它不起作用。 我是否缺少简单的东西? 为了确保一切都在更新,我一直在杀死服务器并重新构建,以确保一切正常。
更糟糕的是,偶尔它已经加入...然后就退出工作以后才另行制定,与逆各种值,有时由抢救孩子的加入请求=父到子,有时。 我在吵架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个主要项目都没有运气。
对我来说,一次性正确设置始终是一个问题。 最初,您的代码中的所有内容看起来都不错,但实际上我想知道您是在哪一侧设置inverse属性?
该代码对我有用:
<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" />
我希望这有帮助。
这是正确的映射:
<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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.