2012-05-24 218 views
3

所以我有一個父對象稱爲順序和子級對象集合稱爲orderLineItems Cascade設置爲在nHibernate中的所有刪除孤兒。這是我的代碼。所有刪除孤兒爲Nhibernate

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 : A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance

此外,什麼都之間的差異全刪除,孤兒用一個例子。

+0

您是否嘗試過'級聯=「全」'? – mattytommo

+0

這有效,但我真的需要它全部刪除孤兒 – joncodo

回答

4

你已經有了:

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,其次是問題的出現,因爲你正在分配一個新的List來訂購.OrderLineItems,所以NHibernate不知道該如何級聯刪除。爲了得到它的工作,只是改變了下聯:

order.OrderLineItems.Add(orderLineItem1); 
+0

非常感謝! – joncodo

+0

你甚至不需要clear(); – joncodo

+0

我推測你希望集合只包含orderLineItem1,因此刪除其他已經存在的東西? –

0

在您的映射 - 標記)的集合作爲逆(

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

這適用於cascade all和inverse = true。它也適用於全部級聯並反轉= false。它們都不能用於級聯全刪除孤兒 – joncodo