2012-10-11 5 views
5

Ich habe durch eine Reihe von anderen Fragen ähnlich wie diese gelesen - aber neu zu Nhibernate, scheint keiner von ihnen meine Frage zu beantworten, warum Inhibernate wirft eine "Found shared references to eine Sammlung: Order.ShippingAddress.Items“auf den folgenden Code:Nhibernate Throws Gefunden gemeinsame Referenzen zu einer Sammlung

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

Keine Erkenntnisse sind willkommen .... thnx

Antwort

8

ich glaube, das Problem ist, dass Ihr itemsFromDB Sammelobjekt von shippingAddress verwiesen wird und auch von billingAddress.

Beide Entitäten benötigen eigene Sammlungsobjekte. Beide Sammlungen können jedoch Verweise auf dieselben Adressobjekte enthalten.

So ersetzen Ich gehe davon aus shippingAddress.Items = itemsFromDb; mit so etwas wie

shippingAddress.Items.AddRange(itemsFromDb)

oder

shippingAddress.Items = new List<ShippingAddress>(itemsFromDb) sollte den Trick

+0

Gut, klare Antwort tun, die nur meinen Speck gerettet! – Greg

Verwandte Themen