2012-10-11 7 views
5

Ho letto attraverso una serie di altre domande simili a questa - ma essendo nuovo a Nibernato, nessuno di loro sembra rispondere alla mia domanda sul perché Inhibernate lancia un "Trovato riferimenti condivisi a una collezione: Order.ShippingAddress.Items" al seguente codice:Derivati ​​non identificati Trovato riferimenti condivisi a una raccolta

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; 
     } 
} 

Eventuali intuizioni sono apprezzati .... thnx

risposta

8

credo che il problema è che l'oggetto collezione itemsFromDB fa riferimento a shippingAddress e anche da billingAddress.

Entrambe le entità hanno bisogno dei propri oggetti di raccolta. Tuttavia, entrambe le raccolte possono contenere riferimenti agli stessi oggetti indirizzo.

quindi immagino che la sostituzione con qualcosa di simile shippingAddress.Items = itemsFromDb;

shippingAddress.Items.AddRange(itemsFromDb)

o

shippingAddress.Items = new List<ShippingAddress>(itemsFromDb) dovrebbe fare il trucco

+0

buona, chiara risposta che appena salvato la pancetta! – Greg

Problemi correlati