NHibernate:逐出但仍具有非唯一对象异常

问题描述:

这种方法不是我最好的方法,但是发生了循环引用问题,因此在最后一刻将其拍打起来.出于某种原因,即使我取消了对明细对象的原始引用顺序,但仍与该会话建立了另一种关联.我应该改用get吗?甚至更好的方法是说出所有ID = x的订单?

This method is not my best, but had a circular reference issue going on so slapped it together last minute. For some reason, even though I'm evicting the original referenced order on the detail object, I've still got another association with the session. Should I use a get instead? Or even better is there a way to say evict ALL orders with ID = x ?

public DetailDTO SaveNewDetailToOrder(DetailDTO detailDTO)
    {
        var detailReturn = new DetailDTO();

        try
        {
            var order = LoadOrderById(detailDTO.OrderId);
            var previousStatus = issue.CurrentDetailStatus;

            if (previousStatus != null && detailDTO.Status.Id != previousStatus.Id)
            {
                var detail = Mapper.Map<DetailDTO, Detail>(detailDTO);
                _orderRepository.EvictOrder(detail.DetailOrder);
                order.Details.Add(detailDTO);
                order.IsEscalated = false;
                order.DormantDate = detailDTO.CreatedTime;

                var orderReturn = SaveOrder(order);   ///Error Here
                if (orderReturn.IsActionSuccessful)
                {
                    detailReturn =
                        orderReturn.Details.DTOObjects.OrderByDescending(x => x.CreatedTime).First();
                    SendStatusChangeEmail(orderReturn);
                }

            }
            else
            {

                detailReturn = _detailService.SaveDetail(detailDTO);
            }

        }
        catch (Exception ex)
        {
            throw ServiceErrorMessage(ex, detailReturn);
        }

        return detailReturn ;

    }

您可以访问会话对象,然后随便使用

You can access session objects and use then whatever you like

session.GetSessionImplementation().PersistenceContext.EntityEntries

但是如果我是您,我将确保我逐出正确的对象并花一些时间进行调试.知道发生了什么比寻找解决方法要好

but if I were you i would make sure that i'm evicting the right object and spend some time on debuging. Knowing what is going on is better than searching for workarounds

foreach (var e in session.GetSessionImplementation().PersistenceContext.EntityEntries.Values.OfType<EntityType>().Where(<condition>))
{
    session.Evict(e);
}