I Found It!
I am in idiot and declared my array like so:
Dim types(1) As NHibernate.SqlTypes.SqlType
types(0) = New SqlTypes.SqlType(DbType.Int16)
Return types
thinking that (1) was the size of the array, when in fact it is the upper
dimension. so. changing that 1 to a 0 fixed the problem.
*sigh*
hopefully this saves someone else from wasting as much time as i have.
Patricia
On Wed, May 27, 2009 at 10:07 AM, Patricia Vandermeer <
[email protected]> wrote:
> Hi Fabio,
>
> Thanks for the Tip. I've tried to impliment a usertype but I am getting
> the *"property mapping has wrong number of columns:
> VolunteerImpact.Domain.UserInfo.GenderID type: GenderIdType"*
> error that I was having with my other attempt at a user type (that i ended
> up using a listener for(Thanks to your advice, it works great!).
>
>
> It occurs on the config.buildsession
>
> Here is the relevant mapping line:
> <property name="GenderId" column="GenderID" access="property"
> type="VolunteerImpact.Data.GenderIdType, VolunteerImpact.Data" />
>
> Here is the User Type Code:
> Imports NHibernate.UserTypes
> Imports NHibernate
> Imports VolunteerImpact.Common
>
>
>
> Public Class GenderIdType
> Implements IUserType
>
> Public ReadOnly Property IsMutable() As Boolean Implements
> NHibernate.UserTypes.IUserType.IsMutable
> Get
> Return False
> End Get
> End Property
>
> Public ReadOnly Property ReturnedType() As System.Type Implements
> IUserType.ReturnedType
> Get
> Return GetType(GenderIdType)
> End Get
> End Property
>
> Public ReadOnly Property SqlTypes() As NHibernate.SqlTypes.SqlType()
> Implements IUserType.SqlTypes
> Get
> Dim types(1) As NHibernate.SqlTypes.SqlType
> types(0) = New SqlTypes.SqlType(DbType.Int16)
> Return types
> ' Return New () {NHibernateUtil.[String].SqlType}
> End Get
> End Property
>
> Public Function NullSafeGet(ByVal rs As IDataReader, ByVal names As
> String(), ByVal owner As Object) As Object Implements IUserType.NullSafeGet
> Dim obj As Object = NHibernateUtil.[String].NullSafeGet(rs,
> names(0))
>
> If obj Is Nothing Then
> Return Nothing
> End If
>
> Dim gender As Integer? = DirectCast(obj, Integer?)
>
> If gender.HasValue = False AndAlso gender <> 1 AndAlso gender <> 2
> Then
> Throw New Exception("Invalid GenderID")
> Else
> Select Case gender
> Case 1
> Return GenderIdEnum.Male
> Case 2
> Return GenderIdEnum.Female
> Case Else
> Return GenderIdEnum.NotSpecified
>
> End Select
>
> End If
> End Function
>
> Public Sub NullSafeSet(ByVal cmd As IDbCommand, ByVal value As Object,
> ByVal index As Integer) Implements IUserType.NullSafeSet
> Dim gender As GenderIdEnum
> gender = DirectCast(value, GenderIdEnum)
>
> Select Case gender
> Case GenderIdEnum.NotSpecified
> DirectCast(cmd.Parameters(index), IDataParameter).Value =
> DBNull.Value
> Case GenderIdEnum.Male
> DirectCast(cmd.Parameters(index), IDataParameter).Value = 1
> Case GenderIdEnum.Female
> DirectCast(cmd.Parameters(index), IDataParameter).Value = 2
> End Select
>
> End Sub
>
> Public Function DeepCopy(ByVal value As Object) As Object Implements
> IUserType.DeepCopy
> Return value
> End Function
>
> Public Function Replace(ByVal original As Object, ByVal target As
> Object, ByVal owner As Object) As Object Implements IUserType.Replace
> Return original
> End Function
>
> Public Function Assemble(ByVal cached As Object, ByVal owner As Object)
> As Object Implements IUserType.Assemble
> Return cached
> End Function
>
> Public Function Disassemble(ByVal value As Object) As Object Implements
> IUserType.Disassemble
> Return value
> End Function
>
> Public Shadows Function Equals(ByVal x As Object, ByVal y As Object) As
> Boolean Implements IUserType.Equals
> If ReferenceEquals(x, y) Then
> Return True
> End If
>
> If x Is Nothing OrElse y Is Nothing Then
> Return False
> End If
>
> Return x.Equals(y)
> End Function
>
> Public Shadows Function GetHashCode(ByVal x As Object) As Integer
> Implements IUserType.GetHashCode
> Return If(x Is Nothing, GetType(Boolean).GetHashCode() + 473,
> x.GetHashCode())
> End Function
>
>
> End Class
>
>
>
> Here is the property in the class:
>
> Private _GenderId As GenderIdEnum
> Public Overridable Property GenderId() As GenderIdEnum
> Get
> Return _GenderId
> End Get
> Set(ByVal value As GenderIdEnum)
> _GenderId = value
> End Set
> End Property
>
>
> and here is the enum
> Public Enum GenderIdEnum
> NotSpecified
> Male = 1
> Female = 2
> End Enum
>
>
> any help( from anyone) in pin pointing where the error is occurring would
> be greatly appreciated!
>
> Thanks very Much,
> Patricia
>
>
> On Mon, May 25, 2009 at 4:35 PM, Fabio Maulo <[email protected]> wrote:
>
>> custom implementation of IUserType
>>
>> 2009/5/25 Patricia Vandermeer <[email protected]>
>>
>> Hi Everyone,
>>>
>>> here's the situation. We've got a bunch of fields that are enums, that
>>> can be null. For example:
>>>
>>> a user has a gender that is stored in a nullable column (it's a FK to a
>>> Gender Table) and is represented in the application as an enum like so:
>>>
>>> GenderEnum
>>> NotSpecified
>>> Male 1
>>> Female 2
>>>
>>> What we would like to do is have it put NULL in the database if it is Not
>>> Specified. and If it's NULL in the database have it set the field to
>>> NotSpecified.
>>>
>>> I tried making the enum nullable and setting notSpecified = nothing
>>>
>>> but then when i try to use the enum it doesn't work properly.
>>>
>>> we are working with a pre-existing database and code base that we are
>>> upgrading, and the less code that we have to mangle the better.
>>>
>>> any suggestions on the best way to implement this scenario?
>>>
>>> Thanks in Advanced
>>>
>>> Patricia
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Fabio Maulo
>>
>> >>
>>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---