【问题标题】:All delete orphan for Nhibernate所有删除 Nhibernate 的孤儿
【发布时间】:2012-05-24 22:25:28
【问题描述】:

所以我有一个名为 order 的父对象和一个名为 orderLineItems 的子对象集合,其中 Cascade 在 nHibernate 中设置为 All-Delete-orphan。这是我的代码。

using( var session = _sessionManager.GetSession())
        using (var transaction = session.BeginTransaction())
        {

            var order = _repository.GetOrderEagerlyByOrderId(session, fromDb.Id);
            var now = DateTime.Now;
            const string user = "GNB\\Username";
            var future = now.AddYears(1);
            var taxType = new TaxType(0, "Code", "AlternateNameE", "AlternateNameF", "NameE", "NameF", "DescriptionE", "DescriptionF", 13, now, future, user, now, user, now);
            var _serviceCatRep = new ServiceCatalogueRepository();

            var serviceCatalogueItem = _serviceCatRep.GetServiceCatalogueItemByCode(session, "VR-PASS");
            var orderLineItem1 = new OrderLineItem(0, null, "DescriptionE", "DescriptionF", 1, 10, null, null, 5, false, serviceCatalogueItem, null, user, now, user, future);

            order.OrderLineItems.Clear();

            order.OrderLineItems = order.OrderLineItems == null ? new List<IOrderLineItem> { orderLineItem1 } : new List<IOrderLineItem>(order.OrderLineItems) { orderLineItem1 };

            _repository.SaveOrUpdate(session, order);
            transaction.Commit();
        }

它在transaction.Commit(); 上失败并出现错误:

NHibernate.HibernateException : 拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合

另外,举个例子,all 和 all-delete-orphan 有什么区别。

【问题讨论】:

  • 你试过cascade="all"吗?
  • 这行得通,但我真的需要它全部删除孤儿

标签: c# asp.net nhibernate


【解决方案1】:

你有:

order.OrderLineItems.Clear();

order.OrderLineItems = order.OrderLineItems == null 
    ? new List<IOrderLineItem> { orderLineItem1 } 
    : new List<IOrderLineItem>(order.OrderLineItems) { orderLineItem1 };

首先,如果 order.OrderLineItems 为 null,则 order.OrderLineItems.Clear() 将抛出 NullReferenceException,其次,问题出现了,因为您正在为 order.OrderLineItems 分配一个新列表,因此 NHibernate 不知道要级联什么删除。要让它工作,只需将第二行更改为:

order.OrderLineItems.Add(orderLineItem1);

【讨论】:

  • 我假设您希望该集合仅包含 orderLineItem1,因此要删除已经存在的任何其他内容?
【解决方案2】:

在您的映射中 - 将集合标记为 inverse()

HasMany(x=>x.OrderLineItems)
   .Inverse(); 

【讨论】:

  • 这适用于 cascade all 和 inverse = true。它也适用于 cascade all 和 inverse = false。它们都不适用于 cascade all-delete-orphan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
相关资源
最近更新 更多