2012-03-02 16 views
9

Sto utilizzando NHibernate per la gestione del mio database. In una classe che sto calcolando una proprietà utilizzando questa formula:Bug in NHibernate Aliasing

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x) 

La query generato assomiglia a questo:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = this_.Id GROUP BY r.Meter_Id) AS this_.x) 

Ovviamente il nome nella dichiarazione AS viene rinominato this_.x, che provoca l'errore.

Sembra essere un bug noto: NHibernate JIRA #NH-2878

Vuol enyone hanno una soluzione per questo?

risposta

1

Potrei sbagliarmi, ma in realtà non vedo perché hai bisogno dell'alias in quella particolare formula.

In senso più generale, avete alcune opzioni:

  • aggirare il problema. È possibile utilizzare una stored procedure o caricare più dati e eseguire il calcolo in memoria.
  • Risolto il problema. NHibernate è open source: consente di individuare il codice, individuare la causa, isolarlo in un test, correggerlo e inviare una richiesta di pull.
  • Richiedi a qualcun altro di risolverlo. Se la tua azienda utilizza NHibernate e questo è importante per loro, potrebbero probabilmente sponsorizzare un altro contributore NHibernate per implementare una correzione.
+0

L'alias è sicuramente necessario, poiché si verifica un errore SQL quando non viene utilizzato. Mi piacerebbe sapere se qualcuno ha già una soluzione per questo. Se non ce n'è, penso che userò una vista del database per il mio problema. – Coxer

0

non saprei come risolvere il bug, ma si potrebbe provare a scrivere il calcolo come segue:

SELECT TOP 1 MAX(r.Timestamp) AS timestamp 
FROM Reading r, Meter m 
WHERE r.Meter_Id = m.Id AND m.Store_Id = Id 
GROUP BY r.Meter_Id 
order by Max(r.timestamp) asc 
1

Ho avuto questo stesso problema quando si chiama una funzione di database dall'interno di un Fluent NHibernate Map. Metodo Formula(). La mia soluzione era di ripetere il nome completo della funzione invece di provare a usare gli ailas.

Ad esempio, dove EntityColumn2 è una colonna che viene già referenziata \ caricata nell'entità.

SELECT My_Db_Function.Column1 
FROM My_Db_Function(arg1, arg2, arg3, ...) 
WHERE My_Db_Function.Column2 = EntityColumn2 

Il risultato è che il My_Db_Function riferimenti rimangono così come sono (e non sono alias per NHibernate) e l'EntityColumn2 sia correttamente aliasing da NHibernate.

+0

Questo è segnalato bug di NHibernate: https://nhibernate.jira.com/browse/NH-2878 –

+0

I nomi di prefisso possono funzionare anche per i tipi. Nel mio caso, NHibernate ha prefixato il tipo 'datetime' anche con l'alias della tabella, ma dopo averlo modificato in' sys.datetime' ha funzionato. Inoltre citato in http://ayende.com/blog/1720/using-sql-functions-in-nhibernate: "NHibernate eseguirà automaticamente il preposizionamento dell'alias della tabella delle entità corrente a qualsiasi cosa che assomigli ad un accesso non qualificato alla colonna" – Chaquotay