2010-05-27 11 views
12

Estoy tratando de asignar una vista sin un identificador, pero nhibernate aún genera un sql con la columna id (me da un error sql, ya que la columna ID no existe en el db) . Tal vez estoy malinterpretando el constructor Id()?Vista de búsqueda fluida NHibernate sin identificador único

comentarios constructor:

crear un ID que no tiene una propiedad correspondiente en el objeto de dominio, o una columna en la base de datos. Esto es principalmente para uso con acceso de solo lectura y/o vistas. El valor predeterminado es una identidad int con un generador de "incremento".

public class PersonMapping : ClassMap<Person> 
{ 
    public PersonMapping() 
    { 
     Table("person"); 
     ReadOnly(); 

     Id(); 
     Map(f => f.Name, "name"); 
    } 
} 

Respuesta

8

NHibernate necesita un ID. El método doc dice que crea una ID que no tiene una propiedad correspondiente en su objeto de dominio, sin embargo, la base de datos aún tiene una ID.

Si no tiene ningún campo en su tabla para marcar como un identificador (tiene que ser único ...) quizás pueda tratar de identificar algunas columnas que pueden estar compuestas como una identificación compuesta.

Teniendo en cuenta, por ejemplo, una mesa simple enlace que lleva hasta algunos int a otro int como

A | B 
----- 
1 | 2 
1 | 3 
2 | 2 

podría utilizar ID Compuesto, siempre y cuando todas las combinaciones A/B son únicos.

public PersonMapping() 
{ 
    [...] 
    CompositeId() 
     .KeyProperty(x => x.A) 
     .KeyProperty(x => x.B); 
    [...] 
} 
+0

¿Hay alguna manera de ignorar por completo los campos db. ¿Desea Id (Guid.NewGuid) o algo así? –

5

Se podría recuperar los registros como objetos de valor (entidades no administrados) en lugar de entidades.

"14.1.5. Devolución de entidades no gestionados

Es posible aplicar un IResultTransformer a las consultas SQL nativas. Lo que le permite por ejemplo, entidades que no son administrados de retorno.

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO))) 

Este consulta especificada:

  • la cadena de consulta SQL
  • un transformador resultado

La consulta anterior devolverá una lista de CatDTO que ha sido instanciado y se inyectaron los valores de NAME y BIRTHNAME en sus correspondientes propiedades o campos. "

Cuestiones relacionadas