【问题标题】:Nhibernate 3.3.0.4000 incorrectly orphaning child entitiesNhibernate 3.3.0.4000 错误地孤立子实体
【发布时间】:2012-06-16 07:48:26
【问题描述】:

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

这是流畅的映射:

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

有什么想法吗?

【问题讨论】:

  • 能否添加您的模型,特别是您声明/初始化费用项的位置

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看您的映射肯定会有所帮助,但请看一下

    我还将 ExpenseItem 映射到其父项的引用

    How to delete child object in NHibernate?

    基本上你必须在关系上设置反转,这样 NHibernate 就不会尝试用空受害者更新已删除的记录。而你设置 Cascade.All | Cascade.DeleteOrphans,这样我们不仅会通过取消受害者来破坏关系,而且会删除整个子记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多