C# NHibernate SaveOrUpdate合并子集合

C# NHibernate SaveOrUpdate合并子集合,c#,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个类Journal,它有一个IList的JournalLine对象 我创建了一个日志,并意外地通过相同的行生成方法运行了两次。此方法的开始调用\u journalLines.Clear(),结束调用\u session.SaveOrUpdate(journal)。所以我有这个序列: 生成无行的日志,调用保存或更新。那很好 生成三个ID为1,2,3的日志行,添加到日志中。\u日志行并调用保存或更新 调用Journal.\u journalLines.Clear()。之后的断点显示行列表为空

我有一个类
Journal
,它有一个
IList
JournalLine
对象

我创建了一个
日志
,并意外地通过相同的行生成方法运行了两次。此方法的开始调用
\u journalLines.Clear()
,结束调用
\u session.SaveOrUpdate(journal)
。所以我有这个序列:

  • 生成无行的
    日志
    ,调用
    保存或更新
    。那很好
  • 生成三个ID为1,2,3的
    日志行
    ,添加到
    日志中。\u日志行
    并调用
    保存或更新
  • 调用
    Journal.\u journalLines.Clear()
    。之后的断点显示行列表为空
  • 生成三个ID为4,5,6的
    日志行
    ,添加到
    日志中。\u日志行
    并调用
    保存或更新
    。这里的断点显示了
    \u journalLines
    ,其中包含三个内容
  • 剩下的是一本有6行的
    日记
  • 这一切都发生在一个事务中,在完成之前,数据库中不会保留任何内容

    为什么要合并这两个系列?在我看来,它应该到达最后一个
    SaveOrUpdate
    ,断点显示它有三行,并将其保持为有三行。其他三个人是否因为还没有同花顺而在记忆中徘徊

    编辑:映射

    public JournalMap()
    {
        // Other stuff
        HasMany(x => x.JournalLines)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.AllDeleteOrphan();
    }
    
    public JournalLineMap()
    {
        // Other stuff
        References(x => x.Journal);
    } 
    
    Journal
    包含以下内容:

    private readonly IList<JournalLine> _journalLines = new List<JournalLine>();
    public virtual IEnumerable<JournalLine> JournalLines 
                                           { get { return _journalLines; } }
    

    在最终调用
    \u session.Flush()和
    \u session.Transaction.Commit()之前如果刷新没有出错。

    此问题可能与日志映射的样式有关。主要是用于收集的级联设置。如果您使用的是级联设置,如保存更新全部,例如

    <bag name="JournalLines" lazy="true" inverse="true" cascade="save-update"
     ...
    
    注意:根据您上面提供的定义,我猜这就是场景(我刚才解释过)
    如果调用
    session.SaveOrUpdate(eachJournalLine)
    ,则可能会出现其他问题。在这种情况下,
    Clear()
    是不够的,您还必须迭代所有删除的项目,并将它们的关系设置为line.Journal=null

    是否有真正的原因说明为什么您要在一个事务中多次调用SaveOrUpdate?#1是创建保存日志的对象的通用方法的一部分,而#4是一个可以独立调用的方法,另一个调用(#2)是一个错误。我想#1与此并不严格相关,我更想弄清楚为什么#2和#4合并而不是覆盖。集合已经映射为AllDeleteOrphan。更奇怪的是,如果在调用集合上的
    Clear()
    之前,我循环遍历它们并手动终止它们对
    Journal
    的引用,它们仍然被提交,三个引用了
    Journal
    ,三个没有引用。当然这些是孤立的,应该删除。好的,请显示您的映射和代码。因为我只能通过刚才描述的设置和通话重现您的问题。有了更多的细节,我们就可以发现问题所在。我们在上面添加了更多的内容。我看到了我所期望的代码,一点也不奇怪。(很明显,您使用了经过调整的片段,描述了原理)。也许现在怀疑的是某个隐藏的电话。。。对不起,没有更好的答案。。。
    <bag name="JournalLines" lazy="true" inverse="true" cascade="save-update"
     ...
    
    cascade="all-delete-orphan"