2009-03-18 13 views
8

Tengo una clase asignada a una tabla con NHibernate. El problema es que solo algunas de las propiedades se asignan a columnas en la tabla. Esto está bien porque las únicas columnas que utilizamos para visualizar están mapeadas, sin embargo, me preguntaba si hay alguna forma de consultar contra otras columnas en la tabla que no están mapeadas a las propiedades en mi clase.Consultar columnas sin asignar en NHibernate

Por ejemplo tenemos una tabla con las siguientes columnas:

Customer 
----------- 
CustomerId 
Name 
DateCreated 

y tenemos un objeto

public class Customer 
{ 
    public virtual int CustomerId {get;set;} 
    public virtual string name {get;set;} 
} 

y name y customerId se asignan sin embargo DateCreated no se debe a que nunca lo mostramos en cualquier parte . Nos gustaría consultar la tabla Customer para los clientes que se crearon antes de una fecha determinada. ¿Hay alguna manera de hacer esto sin mapeando el DateCreated? También sería preferible hacer esto usando la API de criterios.

Respuesta

11

Ayende Rahien publicó un artículo que describe la especificación de access="noop" en la asignación para especificar propiedades solo de consulta. Ver NHibernate – query only properties. No lo he intentado yo mismo.

+0

Funciona muy bien y es realmente fácil de instalar. – Goblin

+0

No pude conseguir esto para trabajar con el elemento de propiedad, ¿hay algún truco? –

+1

@DaleBurrell Acabo de probar esto también, no funcionó. De acuerdo con los documentos 'noop' ​​no es válido para el atributo' access' en el elemento 'property' (ver [referencia] (http://nhforge.org/doc/nh/en/#mapping-declaration-property)). –

5

¿Está utilizando una consulta SQL simple fuera de la cuestión? No puedo probarlo ahora, pero me imagino que podría consultar en campos no asignados, siempre que su consulta arroje algo que Hibernate puede asignar a un objeto. (Lo siento si esto ya fue descartado como opción)

EDIT: Esto parece funcionar:

ISQLQuery query = session.CreateSQLQuery(
       "select c.* " + 
       "from Customer c " + 
       "where c.CreateDate > :CreateDate"); 

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14)); 
query.AddEntity(typeof(Customer)); 

IList<Customer> results = query.List<Customer>(); 
+0

(mis nombres de columna eran un poco diferentes) –

+0

no está fuera de discusión, pero me gustaría poder utilizar la API de criterios si es posible. Gracias por la publicación – lomaxx

5

Con HQL/consultas de criterios, NHibernate sólo puede trabajar con lo que se ha mapeado (aunque SQL prima es sigue siendo una opción como ha señalado Andy White). Si desea usar las consultas de Criteria, debe mapear la columna.

Sin embargo, NHibernate no está limitado a usar miembros de acceso público. Entonces, si desea seguir ocultando el campo CreateDate, declare una propiedad privada (¿tal vez de solo lectura?). Como alternativa, puede omitir la propiedad e indicar a NHibernate que use el acceso de nivel de campo configurando access="field" en el elemento de propiedad en la asignación.

Sé que quería hacer esto sin mapear el campo, pero simplemente no creo que sea posible (sin modificar la fuente NHibernate;). Aún así, si realiza una consulta en el campo, el campo tiene cierta relevancia para su dominio y, por lo tanto, probablemente merezca que se lo asigne, y con un miembro privado o protegido puede mantener oculta la información.

+0

He intentado usar una propiedad privada, pero no se puede tener una propiedad virtual privada en C# y nhibernate necesita una propiedad virtual :( –

Cuestiones relacionadas