【问题标题】:NHibernate Many-to-one cascadeNHibernate 多对一级联
【发布时间】:2014-06-15 22:25:16
【问题描述】:

我有以下两个类:

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 表对 LegalEntity 的 PK 列有一个 FK。一个项目将只有一个法人实体。不同的项目可以有相同的法人实体。所以这就是我选择多对一的原因。不过不确定这是否正确。

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

【问题讨论】:

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


    【解决方案1】:

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

    <many-to-one
        ...
        cascade="all|none|save-update|delete"              (4)
        ...
    

    此外,NHibernate 的会话几乎不可能处理此功能。因为不必明确,引用的many-to-one 确实是孤儿。 DB中应该有一些更进一步的检查...可能有其他地方引用此表行...

    建议:在您的代码中将其作为 DAO 或业务外观实现的一部分。检查是否真的有no依赖,然后显式发出Delete()

    EXTEND:这是一个QueryOver 语法,用于获取所有“孤儿”法人实体的列表

    // 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>();
    

    【讨论】:

    • 感谢您的回复。在 SQL 中,我会执行以下查询: select * from LegalEnt where LegalEntId not in (select LegalEntId from Project) Whats will be the equivalent query for this in NH?
    • 在 NHibernate 中几乎相同 ;) 检查 nhforge.org/doc/nh/en/… 在那里您可以快速了解如何使用 QueryOver ... 或在这里询问 ;)
    • 感谢 Radim。你的帖子很有帮助。我无法正确使用 QueryOver。如果您能帮助我将上述 SQL 转换为 NH,我将不胜感激。
    • 我会告诉你如何......(也许今天晚些时候,但我会)。
    • 我扩展了我的答案,认为它应该是你可以用来获取孤儿列表的东西......迭代它并删除它们......另外,也许检查一下:DML - nhforge.org/doc/nh/en/index.html#batch-direct
    【解决方案2】:

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

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

    documentation 也更新了,现在说:

    cascade="all|none|save-update|delete|delete-orphan|all-delete-orphan"

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多