2010-07-26 22 views
9

Comencé a usar NHibernate 3.0 y PostgreSQL para un proyecto pequeño, hasta ahora el viaje ha sido un poco difícil debido a que el sitio NHibernate está inactivo y estoy seguro de que esta respuesta está en su sitio web en alguna parte.Citando nombres de columnas con NHibernate y PostgreSQL

que tienen una base de datos que tiene estas dos columnas (por supuesto hay más en la mesa real):

int ID 
String Feature 

ahora estoy usando un FluentNHibernate para hacer el mapeo por lo menos así:

public class MyEntityMap: ClassMap<MyEntity> 
{ 
    public MyEntityMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.Feature); 
    } 
} 

y una consulta LINQ para salir los datos

var strucs = from str in session.Query<MyEntity>() 
      where str.ID < 5 
      select str; 

la consulta generará el correcto Declaración de SQL, bien tipo de. El problema es, porque tengo mis letras mayúsculas en los nombres de columna hay que envolverlos entre comillas pero el código SQL generado es como la siguiente:

SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
     FROM "MyEntity" this_ WHERE this_.ID < 5 

Cuando las columnas no tienen comillas alrededor de ellos. Si ejecuto esto obtengo una "columna this_.id" no se encuentra, etc.

¿Alguien sabe cómo puedo conseguir NHibernate para ajustar los nombres de las columnas entre comillas?

EDIT: No puedo escribir en minúscula los nombres de las columnas ya que hay algunas columnas que un programa de terceros debe estar todo en mayúsculas.

He intentado añadir .ExposeConfiguration (CFG => cfg.SetProperty ("hbm2ddl.keywords", "auto-cita") pero no parece hacer nada.

Respuesta

3

Como se supone que el hbm2ddl.keywords hace esto por usted y no funciona, sugeriría usted para agarrar nhibernate source, y depurarlo con su proyecto.

Problably usted puede comenzar con un punto de interrupción en SessionFactor yImpl.cs línea 171

if (settings.IsAutoQuoteEnabled) 

Ven a ver método QuoteTableAndColumns public static void (configuración de configuración) en SchemaMetadataUpdater.cs

espero que ayude.

+1

hmm arroja un error sobre 'anulación pública IDataBaseSchema GetDataBaseSchema (conexión DbConnection) 'porque el' PostgreSQLDialect' doesn' t anularlo para proporcionar uno, por lo que el código en 'if (settings.IsAutoQuoteEnabled)' arroja una excepción y simplemente lo ignoran. Me pregunto por qué nadie ha implementado ese método para PostgreSQL. –

+1

Gracias por el punto en la dirección correcta, implementé mi propio GetDataBaseSchema rápido para PostgreSQLDialect y parece estar funcionando bien ahora. –

+2

@Nathan, ¿podría compartir la solución? –

2

No utilice mayúsculas en Esto resolverá este problema y hará que las consultas ad-hoc sean menos dolorosas ya que no tendrá que seguir citándolos.

+1

El único problema es que otro programa (no hecho por mí) tiene que tener una de las columnas en mayúsculas :( –

4

Comprendo que esto es una pregunta bastante antiguo, pero para otros que pueden acabar aquí también podría implementar una estrategia de asignar nombre, al configurar su fábrica de sesiones necesita añadir:

Fluently.Configure(new Configuration() 
    .SetNamingStrategy(new CustomNamingStrategy()))... 

En CustomNamingStrategy, implementar la interfaz NHibernate.Cfg.INamingStrategy y, básicamente, todos los métodos devuelven los parámetros con comillas a su alrededor.

Cuestiones relacionadas