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.