我有以下两个类:
public class Project
{
public virtual int ProjectId { get; set; }
public virtual string ProjectName { get; set; }
public virtual LegalEntity LegalEntity { get; set; }
}
和
public class LegalEntity
{
public virtual int LegalEntId { get; set; }
public virtual string Name { get; set; }
}
映射为:
<class name="Project" table="Project" dynamic-update="true">
<id name="ProjectId">
<generator class="native"/>
</id>
<property name="ProjectName" />
<many-to-one name="LegalEntity" column="LegalEntId" fetch="join" cascade="all-delete-orphan" />
</class>
和
<class name="LegalEntity" table="LegalEnt" dynamic-update="true">
<id name="LegalEntId">
<generator class="native"/>
</id>
<property name="Name" />
</class>
在数据库中,Project表有一个FK到LegalEntity的PK列。一个项目只有一个法人实体。不同的项目可以有相同的法律实体。这就是我多对一的原因。不确定这是否正确。
插入和更新工作正常。但是,如果我更新项目中的法人实体ID并且该法律实体变为孤儿,我希望将其删除。但它没有发生。我在理解delete-all-orphan时错了吗?如果是,我该如何实现这种行为?
答案 0 :(得分:10)
many-to-one
级联不支持all-delete-orphan
,请参阅:
<many-to-one ... cascade="all|none|save-update|delete" (4) ...
此外,NHibernate的会话几乎不可能处理这个功能。因为不必清楚,引用的many-to-one
实际上是孤儿。在DB中应该有一些更远的检查...可能有其他地方引用这个表行...
建议:在您的代码中将其作为DAO或Business Facade实现的一部分来执行。检查是否确实存在无依赖关系,然后发出明确的Delete()
EXTEND:这是一个QueryOver
语法,用于获取所有“orphan”的列表 LegalEntity
// subquery
var subquery = QueryOver.Of<Project>()
.Select(x => x.LegalEntity.LegalEntId);
// just these legal entities, which are NOT used
var query = session.QueryOver<LegalEntity>()
.WithSubquery
.WhereProperty(y => y.LegalEntId)
.NotIn(subquery)
;
// orphans
var list = query
.List<LegalEntity>();
答案 1 :(得分:0)
all-delete-orphan
和delete-orphan
已经实施 many-to-one
。
当OP提出问题或Radim Köhler wrote his answer时,不支持这些,但我认为未来的访问者会更新这些更新。
documentation也已更新,现在说:
级联= “所有|无|保存更新|删除|删除孤儿|全删除-孤儿”
<子>
但是文档现在很混乱,因为它仍然有以下注释:
cascade属性允许以下值:all,save-update,delete,none。
所以我创建了a defect来修复文档的最后一部分。
子>