Nhibernate 回退纤维酸盐

Nhibernate 回退纤维酸盐,nhibernate,transactions,abort,identifier,event-listener,Nhibernate,Transactions,Abort,Identifier,Event Listener,如果事务中止,我想让NHibernate回滚事务期间保存的任何实体的标识符。我使用的是NHibernate2.1.0,默认情况下它不会这样做。我提出了以下解决方案,在一定程度上有效: public class RevertIdentifiersEventListener : DefaultSaveEventListener { private class RevertIdentiferSynchronization : ISynchronization { pri

如果事务中止,我想让NHibernate回滚事务期间保存的任何实体的标识符。我使用的是NHibernate2.1.0,默认情况下它不会这样做。我提出了以下解决方案,在一定程度上有效:

public class RevertIdentifiersEventListener : DefaultSaveEventListener
{
    private class RevertIdentiferSynchronization : ISynchronization
    {
        private IClassMetadata _classMetadata;
        private object _entity;
        private object _originalIdentifier;

        public RevertIdentiferSynchronization(IClassMetadata classMetadata, object entity)
        {
            _classMetadata = classMetadata;
            _entity = entity;
            _originalIdentifier = classMetadata.GetIdentifier(entity, NHibernate.EntityMode.Poco);
        }

        #region ISynchronization Members

        public void AfterCompletion(bool success)
        {
            if (success == false)
            {
                _classMetadata.SetIdentifier(_entity, _originalIdentifier, NHibernate.EntityMode.Poco);
            }
        }

        public void BeforeCompletion()
        {
        }

        #endregion
    }


    protected override object EntityIsTransient(SaveOrUpdateEvent @event)
    {
        IEntityPersister entityPersister = @event.Session.GetEntityPersister(@event.EntityName, @event.Entity);
        if (entityPersister.HasIdentifierProperty)
        {
            RevertIdentiferSynchronization revertIdentiferSynchronization = new RevertIdentiferSynchronization(entityPersister.ClassMetadata, @event.Entity);
            if (@event.Session.Transaction.IsActive)
            {
                @event.Session.Transaction.RegisterSynchronization(revertIdentiferSynchronization);
            }
        }
        return base.EntityIsTransient(@event);
    }

}
问题在于,如果实体的保存将该保存级联到关联实体,则该实体的标识符不会回滚。上面的EntityIsTransient不是为这些实体调用的,它只为显式调用Save的实体调用


在级联时如何让它工作,有什么建议吗

我不确定您希望在什么情况下中止事务,但我假设您需要这样的东西:

    using( var transaction = SessionFactory.GetSession().BeginTransaction())
    {
        try
        {
           session.Update(entity); // throws exception for some reason
        }
        catch(Exception ex)
        {
            transaction.Rollback(); // rollback the transaction
        }
    }

她在问你回滚后做什么。我也有同样的问题。如果实体包含对新子模型的引用,并且NHibernate尝试插入该子实体,则会更改其标识符(Guid),使其不再是新Guid()。我们需要以某种方式回滚子对象的标识符,以便知道它从未被iserted。