代码改变世界

A different object with the same identifier value was already associated with the session

2012-12-13 23:22  Fred-Xu  阅读(2144)  评论(0编辑  收藏  举报

这个错误非常诡异,把我搞死了要,查阅了很多资料,找到了Merge这个方法,那么开始改造代码:

IRepository接口添加Merge方法:

        bool Add(TEntity entity);
        bool Add(IEnumerable<TEntity> items);
        bool Update(TEntity entity);
        bool Delete(TEntity entity);
        bool Delete(IEnumerable<TEntity> entities);
        object Merge(TEntity entity);

GenericRepository实现其接口:

public object Merge(T entity)
        {
            return _session.Merge(entity);
        }

Controller:

[HttpPost]
        public ContentResult CreateAsync(Order order, FormCollection collection)
        {
            try
            {
                //order = new Order();
                TryUpdateModel<Order>(order, "Order");
                //UpdateModel<Order>(order, "Order");

                UpdateRelationalModel(order, collection);

                order.Operator = new CurrentUser().UserInfo;
                order.State = OrderState.Active;
                order.Status = true;
                order = _orderRepository.Merge(order) as Order;
                _orderRepository.Add(order);

                _unitOfWork.Commit();

                return Content("true");
            }
            catch (Exception ex)
            {
                _unitOfWork.Rollback();
                _logger.Error("保存并继续新增订单发生错误!{0}", ex);

                return Content("false");
            }
        }

这里抛出该异常是因为order.Operator对象引起的,使用了Merge方法来合并order对象后执行添加至数据库方法,Done!

It works!

NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 1, of entity: PekingHandicraftPMS.Data.Entities.User
在 NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:行号 688
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 227
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 186
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 69
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 53
在 NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:行号 2626
在 NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:行号 548
在 NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\CascadingAction.cs:行号 249
在 NHibernate.Engine.Cascade.CascadeToOne(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Cascade.cs:行号 213
在 NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Cascade.cs:行号 181
在 NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Cascade.cs:行号 148
在 NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Cascade.cs:行号 126
在 NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave(IEventSource source, IEntityPersister persister, Object entity, Object anything) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractSaveEventListener.cs:行号 360
在 NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractSaveEventListener.cs:行号 224
在 NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractSaveEventListener.cs:行号 187
在 NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractSaveEventListener.cs:行号 119
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 162
在 NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveEventListener.cs:行号 29
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 148
在 NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveEventListener.cs:行号 21
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:行号 53
在 NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:行号 2612
在 NHibernate.Impl.SessionImpl.Save(Object obj) 位置 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:行号 474
在 PekingHandicraftPMS.Data.NHibernate.Repository.GenericRepository`1.Add(T entity) 位置 E:\My Studio\Easecore\Peking Production Management System\trunk\PekingHandicraftMOS\PekingHandicraftMOS.Data.NHibernate\Repository\GenericRepository.cs:行号 24
在 PekingHandicraftPMS.Web.Controllers.OrderController.CreateAsync(Order order, FormCollection collection) 位置 E:\My Studio\Easecore\Peking Production Management System\trunk\PekingHandicraftMOS\PekingHandicraftMOS.Web\Controllers\OrderController.cs:行号 291