Posts
163
Comments
179
Trackbacks
5
martedì 22 febbraio 2011
NHibernate: utilizzare lo 0 per rappresentare l’assenza di entità


Quando si ha a che fare con database legacy, potrebbe saltar fuori la necessità di non inserire nel database valori nulli per le relazioni many-to-one nulle, ma bensì il valore zero.

Questo post su NHForge, discute la problematica e definisce una soluzione. Per chi avesse bisogno della versione in VB.NET ecco il codice convertito:

   1: Public Class NullableTuplizer
   2:     Inherits PocoEntityTuplizer
   3:  
   4:     Sub New(ByVal entityMetamodel As EntityMetamodel, ByVal mappedEntity As PersistentClass)
   5:         MyBase.New(entityMetamodel, mappedEntity)
   6:     End Sub
   7:  
   8:     Public Overrides Function GetPropertyValuesToInsert(ByVal entity As Object, ByVal mergeMap As IDictionary,
   9:                             ByVal session As NHibernate.Engine.ISessionImplementor) As Object()
  10:         Dim values() As Object = MyBase.GetPropertyValuesToInsert(entity, mergeMap, session)
  11:         ' Dirty hack 1
  12:         For i As Integer = 0 To values.Length - 1
  13:             If (values(i) Is Nothing AndAlso GetType(IEntity).IsAssignableFrom(getters(i).ReturnType)) Then
  14:                 values(i) = ProxyFactory.GetProxy(0, Nothing)
  15:             End If
  16:         Next
  17:         Return values
  18:     End Function
  19:  
  20:     Public Overrides Function GetPropertyValues(ByVal entity As Object) As Object()
  21:         Dim values() As Object = MyBase.GetPropertyValues(entity)
  22:         ' Dirty hack 2
  23:         For i As Integer = 0 To values.Length - 1
  24:             If (values(i) Is Nothing AndAlso GetType(IEntity).IsAssignableFrom(getters(i).ReturnType)) Then
  25:                 values(i) = ProxyFactory.GetProxy(0, Nothing)
  26:             End If
  27:         Next
  28:         Return values
  29:     End Function
  30:  
  31:     Public Overrides Sub SetPropertyValues(ByVal entity As Object, ByVal values() As Object)
  32:         ' Dirty hack 3
  33:         For i As Integer = 0 To values.Length - 1
  34:             If GetType(IEntity).IsAssignableFrom(getters(i).ReturnType) Then
  35:                 Try
  36:                     ' Provo ad accedere alla proprietà id
  37:                     If CType(values(i), IEntity).ID = 0 Then
  38:                         values(i) = Nothing
  39:                     End If
  40:                 Catch ex As Exception
  41:                     ' Errore. Il proxy ha restituito un errore
  42:                     values(i) = Nothing
  43:                 End Try
  44:             End If
  45:         Next
  46:         MyBase.SetPropertyValues(entity, values)
  47:     End Sub
  48:  
  49: End Class

Due note: l’interfaccia IEntity è un’interfaccia base implementata dalle mie entità. Nel mio caso definisce solo la proprietà ID, ma potrebbe anche essere completamente vuota o avere altre proprietà comuni.

La funzione SetPropertyValues è invece leggermente diversa da quella proposta sul post linkato in precedenza. In particolar modo, nel mio caso quando provavo ad accedere all’ID della mia entità, veniva sempre lanciata un’eccezione in quanto il proxy non riusciva a trovare l’entità con ID 0. Forse è un mio errore e forse la soluzione proposta (il try-catch) non è il massimo della vita, ma al momento la soluzione funziona.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (0)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS