NHibernate:具有相同标识符值的不同对象已与会话关联

时间:2013-01-12 20:57:48

标签: c# nhibernate

我正在使用NHibernate&在我的项目中使用C#和MySql db的Net Persistence API,我有UI层(ASP.NET),业务层和数据访问层(DAL)。我在DAL的UserManager类中有以下Save方法:

private EntityManager GetEm()
{
    if (_entityManager == null)
    {
        _entityManagerFactory = Persistence.CreateEntityManagerFactory("JPUMain");
        _entityManager = _entityManagerFactory.CreateEntityManager();
    }
    return _entityManager;
}

public void Save(IGenericEntity entity)
{
    _entityManager = GetEm();
    _entityManager.GetTransaction().Begin();
    _entityManager.Persist(entity);
    _entityManager.Flush();            
    _entityManager.GetTransaction().Commit();            
    _entityManager.Clear();
}

我的用户实体:

[Entity]
[Table(Name = "user")]
public class User : IGenericEntity
{
    [Id]
    [GeneratedValue]
    public virtual int ID { get; set; }

    [Basic]
    [Column(Name = "name", Nullable = false)]
    public virtual string Name { get; set; }

    [ManyToOne(Fetch = FetchType.EAGER, TargetEntity = typeof(Tag), Cascade = new[] { CascadeType.ALL })]
    [JoinColumn(Name = "tag_id")]
    public virtual Tag Tag { get; set; }
}

标记实体:

public class Tag : IGenericEntity
{
    [Id]
    [GeneratedValue]
    public virtual int ID { get; set; }

    [Basic]
    [Column(Name = "name", Nullable = false)]
    public virtual string Name { get; set; }

    [Temporal(TemporalType.TIMESTAMP)]
    [Column(Name = "created_on", Nullable = false)]
    public virtual DateTime CreatedOn { get; set; }
}

我在我的业务逻辑中的一个方法中执行以下操作:

public void DoOperation()
{    
  var tags = FindAllTags() // Get list of all tag entities.

  for(var tag in tags)
  {
     var user = new User{    
         Name = "XYZ",
         Tag = tag
     };
  }
  UserManager.Save(user); // Save method just calls the save method of entity manager.

}

现在我在UserManager.Save(user);

行中遇到以下错误
Exception in saving questionNPersistence.PersistenceException: a different object with the same identifier value was already associated with the session: 1, of entity: JDAL.Impl.Entities.Tag ---> NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 1, of entity: JDAL.Impl.Entities.Tag
  at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
  at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister)
  at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event)
  at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
  at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
  at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
  at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)

据我检查过这个问题,我想我在1个会话中检索标签,然后尝试将其保存在与User的另一个会话中(因为Tag已映射到用户,因此在保存用户时它也将尝试更新标签)。但我不知道如何使用.NET JPA在1个会话中执行此操作?

有人可以解决这个问题吗?

修改

此问题仅发生在生产中。我无法在使用Visual Studio 2010调试代码的开发环境中重现此问题。

0 个答案:

没有答案