[NHibernate] Date null e MinValue

In questi giorni sto proseguendo con lo sviluppo di un'applicazione che utilizza NHibernate per persistere i dati sul DB Sql.

Si tratta del secondo progetto nel quale utilizzo NHibernate ed il primo era talmente particolare (un engine di report e query su base oggetti che sfruttava Reflection) che non mi sono neanche ritrovato realmente di fronte a problematiche real-world.

Oggi pomeriggio, però, mi sono trovato di fronte ad un campo date del db che in alcuni casi doveva essere null. Lì per lì era come se mi fossi dimenticato dell'esistenza di questo tipo di problema...

Ovviamente DateTime non accetta null (ok, nella 2.0 ci sono i nullable ma alla fin fine "sotto" c'è sempre il value type...) e pertanto, da quando utilizzo .NET, ho sempre utilizzato la costante MinValue per "rappresentare" la condizione di "nessun dato".

Ma giustamente al momento di persistere l'oggetto che conteneva quel valore in una proprietà, NHibernate ha sollevato l'eccezione: "Scuss, signò: qui è svampato tutto! Che ci faccio co' 'sta roba?".

Dopo un'oretta buona di malditesta tra ricerche su Google, "srotellate" di mouse sulla guida di NHibernate mi sono imbattuto nella proprietà "access" del tag "property", contenuto nel file di mapping della classe (non so cos'è peggio tra il gioco di parole e la matrioska di annidamenti!).

Comunque dicevo, che questa proprietà permette di specificare a NH il nome univoco di una classe custom che effettua la lettura e la scrittura da e sull'oggetto per quella specifica proprietà.

<property name="EndDate" access="NomeCompletoClasse, NomeAssembly" />

Ok, ma 'sta classe custom? Niente di più semplice! Deve solo implementare l'interfaccia NHibernate.Property.IPropertyAccessor avvalendosi di altre due "classettine" che implementano NHibernate.Property.IGetter e NHibernate.Property.ISetter.

L'implementazione? Beh, se non avete M.rkino dietro le spalle ("Il copia incolla rovinerà il mondo", cit.) potete "ispirarvi" (ok, scopiazzare) da BasicPropertyAccessor, BasicGetter e BasicSetter. In 10 minuti è pronto il bel PropertyAccessor custom che inserisce MinValue quando trova null nel DB e viceversa inserisce null nel DB quando trova MinValue!

Se interessa a qualcuno, quando ho un po' di tempo posso mettere il link di download alla mia implementazione di DatePropertyAccessor.

Print | posted @ giovedì 1 giugno 2006 22:42

Comments on this entry:

Gravatar # re: [NHibernate] Date null e MinValue
by Mario Duzioni at 03/06/2006 02:47

Ciao Marco, è possibile (probabile) che funzioni coi Nullable ma personalmente, almeno fino ad oggi , preferisco utilizzare i DateTime classici per i membri delle classi di business.

Inoltre ho ancora diversi progetti attivi sulla 1.1 e quindi il problema sarebbe rimasto. :-)

Comunque, per curiosità, proverò.
Gravatar # re: [NHibernate] Date null e MinValue
by Marco De Sanctis at 03/06/2006 03:43

Beh, se sei sulla 1.1 puoi usare i Nullables di NHibernate-contrib. Se poi il problema risiede nella preferenza per i DateTime classici.. allora il mio discorso perde di validità! :)

Io i custom accessor li ho invece utilizzati per supportare le collection type-safe, magari un giorno di questi posto qualcosa in proposito ;)
Comments have been closed on this topic.