I don't know to be honest....the nHibernate DB class is already in
existence in my organisation.  Here is the implementation of the
Session property:

public static nh.ISession Session
{
    get
    {
        nh.ISession session =
(nh.ISession)CallContext.GetData(sessionGuid);

        if (session == null)
        {
            session =
nHibernateDB.GetNHibernateDB().SessionFactory.OpenSession();
            CallContext.SetData(sessionGuid, session);
        }

        return session;
    }
}


Is this not how Sessions should be handled?

On May 11, 1:00 pm, Paco Wensveen <[email protected]> wrote:
> I don't know what's wrong, but why do use reuse the session for
> multiple transactions?
>
>
>
>
>
> On Tue, May 11, 2010 at 1:25 PM, robinsonpr <[email protected]> wrote:
> > Hi,
>
> > I have a strange error which may or may not be related to
> > transactions.  Here is my scenario....
>
> > I have 2 entities with typical one-to-many parent child relationship.
> > One "Document" can have many "DocumentAudit" objects.
>
> > Parent mapping:
>
> > <?xml version="1.0"?>
> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
> > import="true" assembly="Business">
> >    <class name="Business.Domain.Document" table="DOCUMENT"
> > lazy="false">
> >        <id name="Id" type="int" column="DocumentId">
> >            <generator class="native" />
> >        </id>
> >        <property name="FileName" column="FileName" type="string"
> > length="220" />
> >        <bag name="DocumentAudits" cascade="all" lazy="true"
> > inverse="true">
> >            <key column="DocumentId" />
> >            <one-to-many class="Business.Domain.DocumentAudit" />
> >        </bag>
> >    </class>
> > </hibernate-mapping>
>
> > And here is the child:
>
> > <?xml version="1.0"?>
> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
> > import="true" assembly="Business">
> >    <class name="Business.Domain.DocumentAudit" table="DOCUMENT_AUDIT"
> > lazy="true">
> >        <cache usage="read-write"/>
> >        <id name="Id" type="int" column="DocumentAuditId">
> >            <generator class="native" />
> >        </id>
> >        <property name="Action" column="Action" type="string"
> > length="50" />
> >        <property name="Actor" column="Actor" type="string"
> > length="50" />
> >        <many-to-one name="Document" class="Business.Domain.Document"
> > fetch="select">
> >            <column name="DocumentId" unique="true" />
> >        </many-to-one>
> >    </class>
> > </hibernate-mapping>
>
> > I have a generic data access class called BaseBroker which has Persist
> > and Delete methods as follows:
>
> >    public void Persist(T obj)
> >    {
> >        using (ITransaction txn =
> > nHibernateDB.Session.BeginTransaction())
> >        {
> >            try
> >            {
> >                nHibernateDB.Session.Persist(obj);
> >                txn.Commit();
> >            }
> >            catch
> >            {
> >                txn.Rollback();
> >                throw;
> >            }
> >        }
> >    }
>
> >    public void Delete(T obj)
> >    {
> >        using (ITransaction txn =
> > nHibernateDB.Session.BeginTransaction())
> >        {
> >            try
> >            {
> >                nHibernateDB.Session.Delete(obj);
> >                txn.Commit();
> >            }
> >            catch
> >            {
> >                txn.Rollback();
> >                throw;
> >            }
> >        }
> >    }
>
> > All seems OK and I've got some test fixtures covering everyday adding
> > and deleting of objects.  All working fine.
>
> > HOWEVER, I've run into a very strange error.  There is a unique index
> > on the Document.FileName column.  I've written a test which needs to
> > verify that attempting to insert a Document with an existing FileName
> > generates the expected exception.  So the steps in the test are as
> > follows:
>
> > 1. Create new Document "doc1" with 1 new DocumentAudit child.
> > 2. Call Persist(doc1)
> > 3. Create new Document "doc2" with 1 new DocumentAudit child, and the
> > SAME FileName as doc1
> > 4. Call Persist(doc2) -> should generate a unique index exception,
> > catch and verify it
> > 5. Cleanup: call Delete(doc1) to delete the first instance that was
> > persisted successfully
>
> > What's happening when I run this test is this...it all goes as
> > expected right up to the last step when it tries to clean up and
> > delete doc1.  Instead of deleting doc1 I get the following exception:
>
> > Test method
> > BusinessTests.Brokers.DocumentBrokerTests.InsertDuplicateFileNameTest
> > threw exception:  NHibernate.Exceptions.GenericADOException: could not
> > insert: [Business.Domain.DocumentAudit][SQL: INSERT INTO
> > DOCUMENT_AUDIT (Action, Actor, DocumentId) VALUES (?, ?, ?); select
> > SCOPE_IDENTITY()] --->  System.Data.SqlClient.SqlException: Cannot
> > insert the value NULL into column 'DocumentId', table
> > 'dbo.DOCUMENT_AUDIT'; column does not allow nulls. INSERT fails.
> > The statement has been terminated..
>
> > So I've put some debug into the code (in the form of Console.WriteLine
> > in various places).  Look at the Console output (my debug bits start
> > with "==>"):
>
> > ==> About to create 1st instance
> > NHibernate: INSERT INTO DOCUMENT (FileName) VALUES (@p0); select
> > SCOPE_IDENTITY();@p0 = 'test.txt'
> > NHibernate: INSERT INTO DOCUMENT_AUDIT (Action, Actor, DocumentId)
> > VALUES (@p0, @p1, @p2); select SCOPE_IDENTITY();@p0 = 'create', @p1 =
> > 'testuser', @p2 = 39
> > ==> About to create 2nd instance
> > NHibernate: INSERT INTO DOCUMENT (FileName) VALUES (@p0); select
> > SCOPE_IDENTITY();@p0 = 'test.txt'
> > ==> Caught and handled exception
> > ==> About to delete 1st instance
> > NHibernate: INSERT INTO DOCUMENT_AUDIT (Action, Actor, DocumentId)
> > VALUES (@p0, @p1, @p2); select SCOPE_IDENTITY();@p0 = 'create', @p1 =
> > 'testuser', @p2 = NULL
>
> > So as you can see the bit the generated the error was the last
> > statement - @p2 (the DocumentId) is null.
>
> > The bizarre thing is that after the Exception is caught and handled
> > (and the transaction rolled back) the Delete statement should be
> > executed.  But it doesn't do that, it's like it's still got a "queue"
> > of SQL statements it needs to execute, as it tries to insert into
> > DOCUMENT_AUDIT!
>
> > It's almost like the transaction rollback didn't flush the pending SQL
> > statements???
>
> > I hope somebody can help!!
>
> > Paul
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "nhusers" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to 
> > [email protected].
> > For more options, visit this group 
> > athttp://groups.google.com/group/nhusers?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups 
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group 
> athttp://groups.google.com/group/nhusers?hl=en.- Hide quoted text -
>
> - Show quoted text -

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to