Skip to content

NH-2428 - Session.MultiCriteria and FlushMode.Auto inside transaction #865

Closed
@nhibernate-bot

Description

@nhibernate-bot

Carlos Alberto Costa Beppler created an issue — 25th November 2010, 9:25:57:

When using Session.CreateMultiCriteria to execute batches of queries on an session witch FlushMode is Auto, the session is not flushing the pending changes to database.

This causes the same problem when using Future and FutureValue when used with ICriteria or IQueryOver because they use the MultiCriteria to do their jobs.

The problem can be reproduced with the following test case that inserts some entities an then try to query them using those APIs:

    public void OutrosSalvarRecuperarNaMesmaSessao() {
      var original = new List<Aplicativo>() {
        new Aplicativo("Meu Aplicativo 1", "Aplicativo de Teste 1"),
        new Aplicativo("Meu Aplicativo 2", "Aplicativo de Teste 2"),
        new Aplicativo("Meu Aplicativo 3", "Aplicativo de Teste 3"),
        new Aplicativo("Meu Aplicativo 4", "Aplicativo de Teste 4")
      };
      using (var session = SessionFactory.OpenSession()) {
        session.FlushMode = FlushMode.Auto;
        using (var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted)) {
          foreach (var item in original)
            session.Save(item);

          // works
          //var query = QueryOver.Of<Aplicativo>().WhereRestrictionOn(a => a.Nome).IsIn(original.Select(o => o.Nome).ToArray());
          //var fromDb = query.GetExecutableQueryOver(session).List();

          // error => returns 0 items 
          var query = QueryOver.Of<Aplicativo>().WhereRestrictionOn(a => a.Nome).IsIn(original.Select(o => o.Nome).ToArray());
          var fromDb = query.GetExecutableQueryOver(session).Future().ToList();

          // works
          //var query = DetachedCriteria.For<Aplicativo>().Add(Restrictions.InG("Nome", original.Select(o => o.Nome).ToArray()));
          //var fromDb = query.GetExecutableCriteria(session).List<Aplicativo>();

          // error => returns 0 items 
          //var query = DetachedCriteria.For<Aplicativo>().Add(Restrictions.InG("Nome", original.Select(o => o.Nome).ToArray()));
          //var fromDb = query.GetExecutableCriteria(session).Future<Aplicativo>().ToList();

          // works
          //var query = session.CreateQuery("from Aplicativo a where a.Nome in (:nomes)").SetParameterList("nomes", original.Select(o => o.Nome).ToArray());
          //var fromDb = query.List<Aplicativo>();

          // works
          //var query = session.CreateQuery("from Aplicativo a where a.Nome in (:nomes)").SetParameterList("nomes", original.Select(o => o.Nome).ToArray());
          //var fromDb = query.Future<Aplicativo>().ToList();

          Assert.AreEqual(original.Count, fromDb.Count);
        }
      }

The thests are been run using .NET Framework 4 and SQLite data provider.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions