Nhibernate 3.3.0.4000错误的孤儿子实体

时间:2012-06-13 10:58:38

标签: c# nhibernate fluent-nhibernate

我在生产系统中有一个间歇性问题,我无法在本地重新创建。似乎正在发生的事情是,在编辑子实体期间没有明显的原因并且保存包含该集合的父级,在数据库中删除子实体上的父关联。有效地孤儿子实体。

以下是流畅的映射:

 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);
....

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

查看您的地图肯定会有所帮助,但请查看

我还会将ExpenseItem映射到对其父

的引用

How to delete child object in NHibernate?

基本上你要对关系设置反转,以便NHibernate不会尝试使用null受害者更新已删除的记录。你设置了Cascade.All | Cascade.DeleteOrphans,这样我们不仅可以通过清空受害者来破坏关系,还可以删除整个子记录。

答案 1 :(得分:0)

此问题是由NHibernate中的错误引起的。我已经将会话设置为从不刷新,但是当您在会话中调用isdirty时,会话首先被刷新。用户正在删除费用项,然后取消编辑,但在isdirty检查期间,正在刷新删除。管理通过更改此类对话框的会话管理方式来解决此问题。