NHibernate多对一级联

时间:2014-06-15 22:25:16

标签: nhibernate many-to-many one-to-many one-to-one

我有以下两个类:

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时错了吗?如果是,我该如何实现这种行为?

2 个答案:

答案 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)

正如您在commit from Nov 19, 2014中看到的那样,现在all-delete-orphandelete-orphan 已经实施 many-to-one

当OP提出问题或Radim Köhler wrote his answer时,不支持这些,但我认为未来的访问者会更新这些更新。

documentation也已更新,现在说:

  

级联= “所有|无|保存更新|删除|删除孤儿|全删除-孤儿”

<子> 但是文档现在很混乱,因为它仍然有以下注释:
cascade属性允许以下值:all,save-update,delete,none。
所以我创建了a defect来修复文档的最后一部分。