gpt4 book ai didi

c# - NHibernate SaveOrUpdate 合并子集合

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:03 24 4
gpt4 key购买 nike

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

我创建了一个 Journal 并意外地通过相同的行生成方法运行了两次。此方法的开头调用 _journalLines.Clear(),结尾调用 _session.SaveOrUpdate(journal)。所以我有这个顺序:

  1. 生成没有行的Journal,调用SaveOrUpdate。没关系。
  2. 生成三个 ID 为 1、2、3 的 JournalLines,添加到 Journal._journalLines 并调用 SaveOrUpdate
  3. 调用 Journal._journalLines.Clear()。之后的断点显示行列表为空。
  4. 生成三个 ID 为 4、5、6 的 JournalLines,添加到 Journal._journalLines 并调用 SaveOrUpdate。此处的断点显示 _journalLines 包含三项内容。
  5. 我剩下一个有 6 行的 Journal

这一切都发生在一个事务中,并且在完成之前不会将任何内容保存在数据库中。

为什么要合并这两个集合?在我看来,它应该到达断点显示它有三行的最后一个 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; } }

生成行的实际代码太复杂了,不能在这里添加,但是它在生成它们之后调用 _journalLines.Add(journalLine);,然后调用它,T 是一个 日志

 public T Add(T entity)
{
_session.SaveOrUpdate(entity);
return entity;
}

在最终调用 _session.Flush()_session.Transaction.Commit(); 之前,如果刷新没有出错。

最佳答案

此问题可能与日志 映射的样式有关。主要是用于您的收藏的级联设置。如果您有级联设置,例如 save-updateall,例如

<bag name="JournalLines" lazy="true" inverse="true" cascade="save-update"
...

然后发生了什么(使用类似的步骤编号):

  1. ...
  2. 此时,集合包含项目 1、2、3 ... SaveOrUpdate(jurnal)会做级联。它还进行级联,即 session 知道要持久保存这 3 个项目
  3. Clear()将清除 IList<>但是没有级联触发器可以从 session 中删除这些项目。此时此刻,我们的前 3 个 JournalLine 确实是孤儿。没有人关心他们
  4. ...
  5. Flush()由事务触发会将所有 JournalLines 插入 DB

解决方案:将映射改为

cascade="all-delete-orphan"

注意:根据您在上面提供的定义,我猜这就是场景(我刚刚解释过)如果您调用 session.SaveOrUpdate(eachJournalLine),您可能会遇到其他问题.在那种情况下 Clear()还不够,您还必须迭代所有删除的项目并将它们的关系设置为 line.Journal = null

关于c# - NHibernate SaveOrUpdate 合并子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19818310/

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