NHibernate:正在逐出,但仍有非唯一对象异常

NHibernate:正在逐出,但仍有非唯一对象异常,nhibernate,Nhibernate,这个方法不是我最好的,但是有一个循环引用问题,所以在最后一分钟把它拼凑起来。出于某种原因,即使我正在逐出细节对象上的原始引用顺序,我仍然与会话有另一个关联。我应该用get来代替吗?或者更好的是,有没有一种方法可以说,用ID=x逐出所有订单 public DetailDTO SaveNewDetailToOrder(DetailDTO detailDTO) { var detailReturn = new DetailDTO(); try

这个方法不是我最好的,但是有一个循环引用问题,所以在最后一分钟把它拼凑起来。出于某种原因,即使我正在逐出细节对象上的原始引用顺序,我仍然与会话有另一个关联。我应该用get来代替吗?或者更好的是,有没有一种方法可以说,用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 ;

    }
public DetailDTO保存新的DetailDTO订单(DetailDTO DetailDTO)
{
var detailReturn=new DetailDTO();
尝试
{
var order=LoadOrderById(detailDTO.OrderId);
var previousStatus=issue.CurrentDetailStatus;
if(previousStatus!=null&&detailDTO.Status.Id!=previousStatus.Id)
{
var detail=Mapper.Map(detailDTO);
_orderRepository.ReceiveOrder(detail.DetailOrder);
order.Details.Add(detailDTO);
order.IsEscalated=false;
order.DormantDate=detailDTO.CreatedTime;
var orderReturn=SaveOrder(order);///此处出错
if(orderReturn.IsActionSuccessful)
{
详细返回=
orderReturn.Details.DTOObjects.OrderByDescending(x=>x.CreatedTime.First();
SendStatusChangeEmail(orderReturn);
}
}
其他的
{
detailReturn=\u detailService.SaveDetail(detailDTO);
}
}
捕获(例外情况除外)
{
抛出ServiceErrorMessage(例如,detailReturn);
}
退货明细退货;
}

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

session.GetSessionImplementation().PersistenceContext.EntityEntries

但是如果我是你,我会确保我驱逐了正确的对象,并花一些时间进行调试。知道发生了什么比寻找解决办法要好

foreach (var e in session.GetSessionImplementation().PersistenceContext.EntityEntries.Values.OfType<EntityType>().Where(<condition>))
{
    session.Evict(e);
}
foreach(session.GetSessionImplementation().PersistenceContext.EntityEntries.Values.OfType().Where()中的变量e)
{
会议.驱逐(e);
}

“知道发生了什么比搜索解决方法更好”完全同意,我们已经过了开发周期,并且已经进入了测试阶段。试着让它回到BAs,这样他们就可以在我研究时根据这个测试其他功能。