NHibernate Session per Call in WCF - How to Rollback

Posted by Corey Coogan on Stack Overflow See other posts from Stack Overflow or by Corey Coogan
Published on 2010-05-10T21:04:27Z Indexed on 2010/05/11 1:44 UTC
Read the original article Hit count: 388

Filed under:
|
|
|
|

I've implemented some components to use WCF with both an IoC Container (StructureMap) and the Session per Call pattern. The NHibernate stuff is most taken from here: http://realfiction.net/Content/Entry/133.

It seems to be OK, but I want to open a transaction with each call and commit at the end, rather than just Flush() which how its being done in the article.

Here's where I am running into some problems and could use some advice. I haven't figured out a good way to rollback. I realize I can check the CommunicationState and if there's an exception, rollback, like so:

        public void Detach(InstanceContext owner)
        {
            if (Session != null)
            {
                try
                {
                    if(owner.State == CommunicationState.Faulted)
                        RollbackTransaction();
                    else
                        CommitTransaction();
                }
                finally
                {
                  Session.Dispose();  
                }

            }
        }

       void CommitTransaction()
        {
            if(Session.Transaction != null && Session.Transaction.IsActive)
                Session.Transaction.Commit();
        }

        void RollbackTransaction()
        {
            if (Session.Transaction != null && Session.Transaction.IsActive)
                Session.Transaction.Rollback();
        }

However, I almost never return a faulted state from a service call. I would typically handle the exception and return an appropriate indicator on my response object and rollback the transaction myself.

The only way I can think of handling this would be to inject not only repositories into my WCF services, but also an ISession so I can rollback and handle the way I want. That doesn't sit well with me and seems kind of leaky.

Anyone else handling the same problem?

© Stack Overflow or respective owner

Related posts about nhibernate

Related posts about wcf