nhibernateisessionidbconnection

nhibernate one isession same idbconnection


I have some code doing 2 times session.Get(id) on the same ISession. I can see that the ISession creates 2 idbconnections. I guess this is because of some kind of configuration. I would like it to do the fetch on the same idbconnection. How?


Solution

  • If both Get operations are in the same transaction, they will share the same IDbConnection. Otherwise you end up with implicit transactions and NHibernate will open and close an IDbConnection for each query. In general, you should try do something like:

    using (var tx = session.BeginTransaction())
    {
        var customer = session.Get<Customer>(123);
        var order = session.Get<Order>(456);
    
        // do stuff
    
        tx.Commit();
    }
    

    Use of implicit transactions is discouraged:

    When we don't define our own transactions, it falls back into implicit transaction mode, where every statement to the database runs in its own transaction, resulting in a large performance cost (database time to build and tear down transactions), and reduced consistency.

    Even if we are only reading data, we should use a transaction, because using transactions ensures that we get consistent results from the database. NHibernate assumes that all access to the database is done under a transaction, and strongly discourages any use of the session without a transaction.