2012-10-11 10 views
5

Przeczytałem kilka innych pytań podobnych do tego - ale będąc nowymi w Nhibernate, żaden z nich nie wydaje się odpowiadać na moje pytanie, dlaczego Inhibernate rzuca "Znaleziono wspólne odniesienia do kolekcja: Order.ShippingAddress.Items”do następującego kodu:Nhibernate Throws Znalazłem wspólne odniesienia do kolekcji

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

Wszelkie spostrzeżenia są doceniane .... thnx

Odpowiedz

8

Myślę, że problemem jest to, że itemsFromDB kolekcja obiekt odwołuje shippingAddress a także przez billingAddress.

Obie jednostki potrzebują własnych obiektów kolekcji. Obie kolekcje mogą jednak zawierać odniesienia do tych samych obiektów adresowych.

więc zakładam, zastępując shippingAddress.Items = itemsFromDb; z czymś jak

shippingAddress.Items.AddRange(itemsFromDb)

lub

shippingAddress.Items = new List<ShippingAddress>(itemsFromDb) powinno wystarczyć

+0

dobry, jasną odpowiedź, że po prostu uratował mi boczek! – Greg

Powiązane problemy