NHibernate多对一级联

Vik*_*ram 6 nhibernate many-to-many one-to-one one-to-many

我有以下两个类:

public class Project
{

    public virtual int ProjectId { get; set; }
    public virtual string ProjectName { get; set; }
    public virtual LegalEntity LegalEntity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public class LegalEntity
{
    public virtual int LegalEntId { get; set; }
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

映射为:

<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>
Run Code Online (Sandbox Code Playgroud)

<class name="LegalEntity" table="LegalEnt" dynamic-update="true">

  <id name="LegalEntId">

    <generator class="native"/>

  </id>



  <property name="Name" />    

</class>
Run Code Online (Sandbox Code Playgroud)

在数据库中,Project表有一个FK到LegalEntity的PK列.一个项目只有一个法人实体.不同的项目可以有相同的法律实体.这就是我多对一的原因.不确定这是否正确.

插入和更新工作正常.但是,如果我更新项目中的法人实体ID并且该法律实体变为孤儿,我希望将其删除.但它没有发生.我在理解delete-all-orphan时错了吗?如果是,我该如何实现这种行为?

Rad*_*ler 10

many-to-one级联不支持all-delete-orphan,请参阅:

<many-to-one
    ...
    cascade="all|none|save-update|delete"              (4)
    ...
Run Code Online (Sandbox Code Playgroud)

此外,NHibernate的会话几乎不可能处理这个功能.因为它不必清楚,所引用many-to-one的实际上是孤儿.在DB中应该有一些更远的检查...可能有其他地方引用这个表行...

建议:在您的代码中将其作为DAO或Business Facade实现的一部分.检查是否确实没有依赖项,然后发出明确的Delete()

EXTEND:这是QueryOver获取所有"孤儿" 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>();
Run Code Online (Sandbox Code Playgroud)