9

私はこれに似た他の多くの質問を読みましたが、Nhibernate は初めてなので、Inhibernate が「コレクションへの共有参照が見つかりました: Order.ShippingAddress.Items」を次のコード:

 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

4

1 に答える 1

12

問題は、あなたのitemsFromDBコレクションオブジェクトがによって参照されshippingAddress、またによって参照されていることだと思いますbillingAddress

どちらのエンティティにも独自のコレクション オブジェクトが必要です。ただし、どちらのコレクションにも同じアドレス オブジェクトへの参照が含まれている場合があります。

shippingAddress.Items = itemsFromDb;だから私は次のようなものに置き換えると仮定します

shippingAddress.Items.AddRange(itemsFromDb)

また

shippingAddress.Items = new List<ShippingAddress>(itemsFromDb)トリックを行う必要があります

于 2012-10-11T21:57:52.093 に答える