- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 Journal
类,它有一个 JournalLine
对象的 IList
。
我创建了一个 Journal
并意外地通过相同的行生成方法运行了两次。此方法的开头调用 _journalLines.Clear()
,结尾调用 _session.SaveOrUpdate(journal)
。所以我有这个顺序:
Journal
,调用SaveOrUpdate
。没关系。JournalLines
,添加到 Journal._journalLines
并调用 SaveOrUpdate
Journal._journalLines.Clear()
。之后的断点显示行列表为空。JournalLines
,添加到 Journal._journalLines
并调用 SaveOrUpdate
。此处的断点显示 _journalLines
包含三项内容。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-update 或 all,例如
<bag name="JournalLines" lazy="true" inverse="true" cascade="save-update"
...
然后发生了什么(使用类似的步骤编号):
SaveOrUpdate(jurnal)
会做级联。它还进行级联,即 session 知道要持久保存这 3 个项目Clear()
将清除 IList<>
但是没有级联触发器可以从 session 中删除这些项目。此时此刻,我们的前 3 个 JournalLine 确实是孤儿。没有人关心他们Flush()
由事务触发会将所有 JournalLines 插入 DB解决方案:将映射改为
cascade="all-delete-orphan"
注意:根据您在上面提供的定义,我猜这就是场景(我刚刚解释过)如果您调用 session.SaveOrUpdate(eachJournalLine)
,您可能会遇到其他问题.在那种情况下 Clear()
还不够,您还必须迭代所有删除的项目并将它们的关系设置为 line.Journal = null
关于c# - NHibernate SaveOrUpdate 合并子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19818310/
我以前使用过像 Netbeans 和 eclipse 这样的 IDE。 我在 friend 的电脑上下载了“Visual Studio Express 2013 for windows desktop
我正在尝试弄清楚如何在 GBA 大小的 EZ Flash 3 合 1 卡中对 PSRAM 进行编程。基本上重复 GBA Exploader 和其他程序所做的事情。 如果我选择一个 block 并对其进
Filter1=re.findall(r'',PageSource) Filter2=re.findall(r'',PageSource) Filter3=re.findall(r'(.*?).*?'
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是一名优秀的程序员,十分优秀!