Nhibernate Throws找到对集合的共享引用

标签 nhibernate fluent-nhibernate

我已经阅读了许多其他与此问题类似的问题-但对于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;
         }
}

任何见解都表示赞赏。
n

最佳答案

我认为问题是,itemsFromDB以及shippingAddress引用了您的billingAddress集合对象。

两个实体都需要它们自己的收集对象。但是,两个集合都可以包含对相同地址对象的引用。

所以我假设用类似的东西替换shippingAddress.Items = itemsFromDb;shippingAddress.Items.AddRange(itemsFromDb)
或者
shippingAddress.Items = new List<ShippingAddress>(itemsFromDb)应该可以解决问题

关于Nhibernate Throws找到对集合的共享引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847615/

相关文章:

hibernate - NHibernate.MappingException : No persister

c# - ServiceStack/FluentNHibernate/MySQL - 两个并发请求使用同一连接

t-sql - linq to nhibernate 中的条件行计数不起作用

.net - 如果更新行每表一个序列,则更新版本字段

fluent-nhibernate - 流利的Nhibernate多对多映射方式

nhibernate - 使用普通 NHibernate 的 SQL 注入(inject)

c# - 在 NHibernate 中包含空值的复合 Id

c# - 与 Fluent Nhibernate 建立一对多关系

NHibernate session 管理

NHibernate 拦截器不要求更改多对多集合/列表