Nhibernate 3.3.0.4000 错误地孤立子实体
本文关键字:实体 错误 4000 Nhibernate | 更新日期: 2023-09-27 18:37:05
我在生产系统中遇到了一个间歇性问题,我无法在本地重新创建。似乎正在发生的事情是,在编辑子实体并保存包含集合的父实体期间,没有明显的原因,在数据库中删除了子实体上的父关联。有效地孤立子实体。
这是流畅的映射:
mapping.HasMany<ExpenseItem>(x => x.ExpenseItems).Cascade.AllDeleteOrphan();
实体也可以直接保存(它也是聚合根),但在测试期间尚未显示删除父关联。
子对象中没有对父对象本身的引用,关联全部在 Nhibernate 处理的数据库中。
也不可能将同一子实体分配给另一个父实体,因为支出项目(子实体)不能直接添加到其父实体之外。请参阅下面的代码。
public virtual ExpenseItem AddNewExpenseItem(ExpenseAnalysis analysis,
string recipientName,
string purchaseAccountReference,
string expenseDescription,
string expenseNotes,
Money value,
VATAnalysis vat)
{
Validate.IsNotNull<ExpenseAnalysis>(analysis);
Validate.IsNotNull(expenseDescription);
....
ExpenseItem newExpenseItem = new ExpenseItem(analysis,
recipientName,
purchaseAccountReference,
expenseDescription,
expenseNotes,
value,
vat,
expenseItemUniqueReference,
true,
Candidate.Assessment);
_expenseItems.Add(newExpenseItem);
....
有什么想法吗?
查看您的映射肯定会有所帮助,但请查看
我还会将费用项映射到其父项
如何在 NHibernate 中删除子对象?
基本上,您必须对关系进行反向设置,以便NHibernate不会尝试使用空受害者更新已删除的记录。然后您设置级联.全部 |Cascade.DeleteOrphans,这样我们不仅通过消除受害者来破坏关系,而且删除整个子记录。
此问题是由 NHibernate 中的错误引起的。我已将会话设置为从不刷新,但是当您在会话上调用 isdirty 时,会话首先被刷新。用户正在删除费用项目,然后取消编辑,但在脏检查期间,删除正在刷新。设法通过更改此类对话的会话管理方式来解决此问题。