2012-10-11 22 views
5

मैं इस एक के लिए इसी तरह अन्य प्रश्न के एक नंबर के माध्यम से पढ़ा है एक संग्रह करने के लिए साझा संदर्भ - लेकिन Nhibernate के लिए नया किया जा रहा है, उनमें से कोई क्यों Inhibernate के लिए एक "मिले साझा संदर्भ फेंक है मेरे सवाल का जवाब करने लगते हैं एक संग्रह: निम्नलिखित कोड को Order.ShippingAddress.Items ":Nhibernate मिले फेंकता

VendorOrderNotificationAcknowledgement ICheckoutVendorService.SendOrderNotification(VendorOrderNotification request) 
{ 
     OrderRepository repo = new OrderRepository(); 
     var order =(AbstractOrder) repo.FindByCartId(request.OrderNotification.CartOrderId); 

     ShippingAddress billingAddress = order.ShippingAddresses[0]; 
     var itemsFromDb = billingAddress.Items; 
     order.ClearAllShippingAddresses(); 
     wcfFactory.UpdateOrder(order); //NO ERROR THROWN HERE! 
     ShippingAddress shippingAddress = orderHelper.CreateShippingAddress(request.ShippingDetails); 
     shippingAddress.Items = itemsFromDb; 
     order.AddShippingAddress(shippingAddress); 

     order.SourceCode = _sourceCode; 
     order.TaxAmount = 0; 
     order.GiftCertificateAmount = 0; 
     order.Status = StatusCode.Approved; 
     order.CreatedAt = request.OrderNotification.OrderTime.Year >2010 
      ? request.OrderNotification.OrderTime 
      : DateTime.Now; 
     order.PurchasedDate= 
            request.OrderNotification.OrderTime.Year>2010 
      ? request.OrderNotification.OrderTime 
      : DateTime.Now; 
     order.UpdatedAt = DateTime.Now; 

     if (request.OrderNotification.OrderCharges != null) 
     { 
      order.ShippingAmount = request.OrderNotification.OrderCharges.Shipping; 
      order.TaxAmount = request.OrderNotification.OrderCharges.DutyAndTaxes; 
     } 
     else 
     { 
      order.ShippingAmount = 0; 
      order.TaxAmount = 0; 
     } 
     order.UseGiftWrap = false; 
     order.SourceCode = _sourceCode; 
     UpdateEshopWorldOrder(order); // THROWS FOUND SHARED REFERENCES TO A COLLECTION: ORDER.SHIPPINGADDRESS.ITEMS 

     var orderDto = orderHelper.CreateOrderDto(billingAddress, orderHelper, order); 
     var dtoShippingAddresses = orderHelper.CreateDtoShippingAddresses(order); 
     orderDto.ShippingAddresses = dtoShippingAddresses; 

     ShippingMethodDto shippingMethodDto = 0; 

     var mine = wcfFactory.SendOrder(orderDto); 

     //More Code below here ... 

} 


public OrderDto CreateOrderDto(ShippingAddress billingAddress, OrderHelper orderHelper, AbstractOrder order) 
{ 
    OrderDto orderDto = new OrderDto(); 
    orderDto.AlternateOrderId = order.Id.ToString(); 
    orderDto.ConfirmationNumber = order.ConfirmationNumber; 
    orderDto.Coupons = new string[0]; 
    orderDto.DiscountAmount = order.DiscountAmount; 
    orderDto.GiftCardAmount = order.GiftCertificateAmount; 
    orderDto.PurchaseDate = order.PurchasedDate; 
    orderDto.ShippingAmount = order.ShippingAmount; 
    orderDto.SourceCode = order.SourceCode; 
    orderDto.TaxAmount = order.TaxAmount; 
    orderDto.UseGiftWrap = order.UseGiftWrap; 
    var customerDto = orderHelper.CreateCustomerDto(billingAddress); 
    orderDto.SoldTo = customerDto; 
    return orderDto; 
} 

public void UpdateEshopWorldOrder(AbstractOrder order) 
{ 
    try 
    { 
     //Session.Update(order); 
     // transaction.Commit(); 
      Session.Flush(); 
    } 
    catch (Exception ex) 
    { 
     _logger.Debug("order saved failed with an error of " + ex.Message); 
     _logger.Error(ex); 
     throw; 
     } 
} 

किसी भी अंतर्दृष्टि की सराहना कर रहे हैं .... thnx

उत्तर

8

मुझे लगता है कि समस्या यह है, कि आपके itemsFromDB संग्रह वस्तु shippingAddress द्वारा संदर्भित है और यह भी billingAddress द्वारा।

दोनों संस्थाओं को अपने स्वयं के संग्रह-वस्तुओं की जरूरत है। दोनों संग्रहों हालांकि एक ही पते-वस्तुओं के लिए संदर्भ हो सकते हैं।

तो मैं जैसे

shippingAddress.Items.AddRange(itemsFromDb)

या

shippingAddress.Items = new List<ShippingAddress>(itemsFromDb) कुछ के साथ shippingAddress.Items = itemsFromDb; की जगह यह मानें कि चाल है कि बस मेरी बेकन बचाया

+0

अच्छा, स्पष्ट उत्तर नहीं करना चाहिए! – Greg