gpt4 book ai didi

NHibernate 多对一级联

转载 作者:行者123 更新时间:2023-12-03 09:51:20 24 4
gpt4 key购买 nike

我有以下两个类:

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 错了吗?如果是,我怎样才能实现这种行为?

最佳答案

many-to-one级联不支持 all-delete-orphan , 看:

  • 5.1.10. many-to-one

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


    此外,几乎不可能通过 NHibernate 的 session 来处理此功能。因为不必清楚,所引用的 many-to-one真是孤儿。在 DB 中应该有一些进一步的检查......可能还有其他地方引用了这个表行......

    建议:作为 DAO 或 Business Facade 实现的一部分在您的代码中执行此操作。检查是否真的有 依赖,然后发出显式 Delete()
    扩展:这是一个 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>();

    关于NHibernate 多对一级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234637/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com