C# Nhibernate:删除包含所有删除孤立项的子集合无效

C# Nhibernate:删除包含所有删除孤立项的子集合无效,c#,nhibernate,C#,Nhibernate,情景: 从UI获取FactorDocDTO并组装到实体 清除它的子集合因素DocDetails 更新FactoryDoc 但是子集合不会删除 FactorDoc详细地图: References(x => x.FactorDoc) .Not.Nullable(); FactorDoc地图: HasMany(x => x.FactorDocDetails) .AsBag() .Not.Key

情景:

  • 从UI获取FactorDocDTO并组装到实体
  • 清除它的子集合因素DocDetails
  • 更新FactoryDoc
  • 但是子集合不会删除

    FactorDoc详细地图:

    References(x => x.FactorDoc)
                    .Not.Nullable();
    
    FactorDoc地图:

    HasMany(x => x.FactorDocDetails)
                    .AsBag()
                    .Not.KeyNullable()
                    .Inverse()
                    .Cascade.AllDeleteOrphan();
    
    更新FactorDoc

    //Create a new session
    FactorDoc doc = _assembler.FromModel(command.FactorDoc);
    
    foreach (var item in doc.FactorDocDetails)
    {
         item.FactorDoc = null;
    }
    
    doc.FactorDocDetails.Clear();
    
    _repository.Update(doc);
    
    //Flush and commit
    

    FactorDocDetails仍在db中,请确保正在刷新会话,并且不需要将其设置为null的foreach循环。就个人而言,我宁愿在事务中执行语句,而不是刷新会话:

    using (NHibernate.ISession session = SessionFactory.GetCurrentSession())
    {
        using (NHibernate.ITransaction tran = session.BeginTransaction())
        {
            doc.FactorDocDetails.Clear();
            tran.Commit();
        }
    }
    

    也很难说你的_repository.Update(doc)实际上在做什么

    花了三天时间,我尝试了所有可能的方法,最后成功了

     _repository.Get(command.FactorDoc.Id);
     FactorDoc doc = _assembler.FromModel(command.FactorDoc);
     _repository.Merge(doc);
    

    FactorDoc不可为空。如何将其设置为空?你已经尝试删除foreach了吗?@Stefan我希望nhibernate删除FactorDocDetails,因为doc.FactorDocDetails.Clear();另外,我尝试了nullable和Nothing foreach,但不起作用。您可以显示Clear()方法吗?也不需要执行_repository.Update(doc);提交就足够了。@MDDDC Clear()是一个CLR方法!而doc是一个分离的实体,因为它是从命令库组装而成的。更新(doc)是必需的!就像doc是分离对象一样,您应该首先从db加载它,然后再加载到Clear()…不知道为什么我会对此投反对票。这些都是这些事情发生的正当理由。