NHibernate has the concept of a User Type. It allows you to specify how a custom type should be mapped between your object model and the database.
An example of an out-of-the-box User Type is the YesNo type. This type allows you to map (“Y”/”N”) values in your database to boolean values in your application. To use this in your application you only need to specify a type in your mapping file:
<property name="IsActive" type="YesNo"/>
For a project I’m working on, I had a similar requirement, but because the application was in Dutch I had to use “J”/”N” instead of “Y”/”N”.
So let’s build our own User Type to achieve this. The nice thing is that I don’t have to start from scratch but can extend one of the existing User Types:
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using NHibernate.Type; | |
using NHibernate.SqlTypes; | |
namespace NHibernate | |
{ | |
/// <summary> | |
/// This is a custom type that can be used to map a boolean field to a char field with the values 'J' and 'N' in the database. | |
/// </summary> | |
public class JaNeeType : CharBooleanType | |
{ | |
/// <summary> | |
/// Initializes a new instance of the <see cref="JaNeeType"/> class. | |
/// </summary> | |
public JaNeeType() | |
: base(new AnsiStringFixedLengthSqlType(1)) | |
{ | |
} | |
/// <summary> | |
/// True value= 'N' | |
/// </summary> | |
/// <value></value> | |
protected sealed override string FalseString | |
{ | |
get | |
{ | |
return "N"; | |
} | |
} | |
/// <summary> | |
/// Gets the name. | |
/// </summary> | |
/// <value>The name.</value> | |
public override string Name | |
{ | |
get | |
{ | |
return "JaNee"; | |
} | |
} | |
/// <summary> | |
/// True value= 'J' | |
/// </summary> | |
/// <value></value> | |
protected sealed override string TrueString | |
{ | |
get | |
{ | |
return "J"; | |
} | |
} | |
} | |
} |
To use this type in our application, we have to change the mapping to:
<property name="IsActive" type="NHibernate.JaNeeType,Sample.NHibernate"/>