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)
。所以我有这个序列:
日志
,调用保存或更新
。那很好日志行
,添加到日志中。\u日志行
并调用保存或更新
Journal.\u journalLines.Clear()
。之后的断点显示行列表为空日志行
,添加到日志中。\u日志行
并调用保存或更新
。这里的断点显示了\u journalLines
,其中包含三个内容日记
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"