我有两个表,表 A 和表 B。
tableA 有列:tabAId、col2、col3(tabAId 主键和标识列。)
表有列:tabAId,名称(tabAId 不为空)
我在tableA的hbm文件中创建了Bag,以维护关系。
<bag name="tableB" lazy="true" inverse="false"
batch-size="25" cascade="all-delete-orphan">
<key column="tabAId" />
<one-to-many class="tableB" />
</bag>
当我尝试更新记录时tableA它抛出异常,因为我在 tableA 实例中有子列表。
[NHibernate.Exceptions.GenericADOException] = {“无法删除集合:[MIHR.Entities.tableA.tableB#21][SQL:UPDATE dbo.tableB SET tabAId = null WHERE tabAId = @p0]”}
InnerException = {“无法将 NULL 值插入到表 'SA_MIHR_DEV.dbo.tableB' 的列 'tabAId' 中;
列不允许为空。 UPDATE 失败。\r\n该语句已终止。"}
解决这个问题只有两种方法。
1)不要使用inverse="false"
<bag name="tableB" lazy="true" inverse="true" // instead of false
batch-size="25" cascade="all-delete-orphan">
<key column="tabAId" />
<one-to-many class="tableB" />
</bag>
这个设置(逆=“真”)会指示NHibernate直接删除一个item来自数据库。
使用时inverse="false"
一般来说总是会导致:
- UPDATE (with null) == 从集合中删除的行为
- 删除项目==级联行为
2) 使引用列可为空
这意味着,我们可以让 NHibernate 来执行 UPDATE 和 DELETE。因为列现在可以为空。
这里仅介绍两种解决方法。
我的偏好是:逆=“真”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)