Tengo un problema con NHibernate, no puedo encontrar ninguna solución para. En mi proyecto tengo una entidad simple (Batch), pero cada vez que intento ejecutar la siguiente prueba, obtengo una excepción. Tengo triede un par de maneras diferentes de realizar una consulta similar, pero una excepción casi idéntica para todos (difiere en qué método LINQ se está ejecutando).NHibernate (3.1.0.4000) NullReferenceException utilizando Query <> y NHibernate Facility
La primera prueba:
[Test]
public void QueryLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.FirstOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
La excepción:
System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
at System.Linq.Queryable.FirstOrDefault(IQueryable`1 source)
La segunda prueba:
[Test]
public void QueryLatestBatch2()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.Query<Batch>()
.OrderBy(x => x.Executed)
.Take(1)
.SingleOrDefault();
Assert.That(batch, Is.Not.Null);
}
}
La excepción:
System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, ref IQuery query, ref NhLinqExpression nhQuery)
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
at System.Linq.Queryable.SingleOrDefault(IQueryable`1 source)
Sin embargo, éste está pasando (usando QueryOver <>):
[Test]
public void QueryOverLatestBatch()
{
using (var session = SessionManager.OpenSession())
{
var batch = session.QueryOver<Batch>()
.OrderBy(x => x.Executed).Asc
.Take(1)
.SingleOrDefault();
Assert.That(batch, Is.Not.Null);
Assert.That(batch.Executed, Is.LessThan(DateTime.Now));
}
}
Utilizando el QueryOver <> API no está mal del todo, pero estoy sólo un poco desconcertado que la consulta <> API ISN' t funcionando, lo cual es algo triste, ya que la operación First() es muy concisa, y nuestros desarrolladores realmente disfrutan de LINQ.
Realmente espero que haya una solución para esto, ya que parece extraño que estos métodos fallen una prueba tan simple.
EDITAR
Estoy usando Oracle 11g, mis asignaciones se hacen con FluentNHibernate registrado a través del castillo de Windsor con el Fondo para NHibernate. Como escribí, lo curioso es que la consulta funciona perfectamente con QueryOver <> API, pero no a través de LINQ.
Hay algo mal con sus asignaciones, configuración u otra parte de su código que no muestra, porque todos esos métodos funcionan bien para mí (y en las pruebas de NH) –
Algo está muy mal con mi configuración. No puedo obtener ningún método en Query <> para que funcione ahora. Supongo que hay algo mal con mis referencias. – Siewers
He encontrado cuál era el problema/es. Aparentemente estoy haciendo algo mal en NHibernateFacility, ya que es el que está causando todos los problemas. Si creo una fábrica de sesiones fuera de las instalaciones, puedo consultar utilizando Query <>, pero con ella, ¡no funciona! – Siewers