NHibernate 不会删除一对多关系中的孤儿

Posted

技术标签:

【中文标题】NHibernate 不会删除一对多关系中的孤儿【英文标题】:NHibernate doesn't delete orphans in one-to-many relationship 【发布时间】:2021-05-26 20:28:43 【问题描述】:

虽然删除和添加工作正常,但当我更新子实体的父集合时,子记录上的外键被简单地设置为空。我希望将它们从数据库中完全删除。

所以我一直在尝试Cascade.AllCascade.DeleteOrphansCascade.All.Include(Cascade.DeleteOrphans),但似乎没有任何效果。

如果我在父项上将 Inverse 设置为 true,但它会导致子记录根本不更新。

这是我的代码:

父类映射

Id(e => e.Id, mapper => mapper.Generator(Generators.HighLow));
Property(e => e.Name);
Bag(e => e.Actors,
      mapper =>
      
        mapper.Key(k => k.Column("Movie_Id"));
        mapper.Cascade(Cascade.All.Include(Cascade.DeleteOrphans));
      ,
      relation => relation.OneToMany(
        mapping => mapping.Class(typeof(Actor))));

子映射

Id(e => e.Id, mapper => mapper.Generator(Generators.HighLow));
Property(e => e.FirstName);

父实体

    public class Movie : EntityBase
    
        public virtual string Name  get; set; 
        public virtual IEnumerable<Actor> Actors  get; set; 
    

更新方法


        public void Update(T entity)
        
            using (var transaction = Session.BeginTransaction())
            
                    try
                    
                        Session.Update(entity)
                        transaction.Commit();
                    
                    catch
                    
                        transaction.Rollback();
                        throw;
                     
                  
        

【问题讨论】:

是的,我做到了。问题是,如果我像许多人建议的那样将 inverse 设置为 true 并级联到 Delete Orphans + All,那么外键将保持原样,甚至不会为空,并且不会删除记录。如果我将 inverse 设置为 false,则外键为空,但仍未删除。 【参考方案1】:

将 Update() 更改为 Merge() 对我有用。

【讨论】:

以上是关于NHibernate 不会删除一对多关系中的孤儿的主要内容,如果未能解决你的问题,请参考以下文章

一对多 JPA 注释不会删除孤儿

单向一对多关系的流畅 NHibernate 配置 - 删除问题

Nhibernate:如何用一对多关系表示多对多关系?

Nhibernate一对多关系复合键问题

NHibernate 级联删除不适用于一对多关联

SQL Alchemy - 从一个实体上的多个一对一关系中删除孤儿[关闭]