Saturday, December 30, 2006

Often times when you're developing an application, there is a one-to-one mapping between your domain model (object model) and your database schema.  Doing it this way often times makes it easier to wrap your head around everything going on in your app.

 

But this isn’t always the right way to do things.  For example, take the highlighted columns in the UserCredential table:


 

In the UserCredential class, do you really want to have HashedPassword, HashType, and PasswordSalt properties?  Probably not...  So, how can we still do our mapping with NHibernate and avoid creating a clunky UserCredential class?  Enter NHibernates CompositeUserTypes!

 

First, let’s create our domain objects:

Notice that the UserCredential class contains a property called Password, which maps to the class Password.

 

Now, let’s create our CompositeUserType, in our case, we’ll call it PasswordCompositeUserType, and this class will implement the NHibernate.IUserType interface:

public class PasswordCompositeUserType : IUserType { public new bool Equals(object x, object y) { if (x == y) return true; if (x == null || y == null) return false; return x.Equals(y); } public object DeepCopy(object value) { if (value == null) return null; else return ((Password)value).Copy(); } public int GetHashCode(object x) { return x.GetHashCode(); } public bool IsMutable { get { return false; } } public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner) { if (rs.IsDBNull(rs.GetOrdinal(names[0])) || rs.GetOrdinal(names[0]) == string.Empty) return null; string hashedPassword = (string)rs[names[0]]; long salt = (long)rs[names[1]]; HashType hashType = (HashType)Enum.Parse(typeof(HashType), (string)rs[names[2]]); Password result = new Password(); result.HashedPassword = hashedPassword; result.Salt = salt; result.HashType = (HashType)Enum.Parse(typeof(HashType), hashType); return result; } public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) { if (value == null) { ((IDataParameter)cmd.Parameters[index]).Value = null; ((IDataParameter)cmd.Parameters[index + 1]).Value = null; ((IDataParameter)cmd.Parameters[index + 2]).Value = null; } else { Password pass = (Password)value; ((IDataParameter)cmd.Parameters[index]).Value = pass.HashedPassword; ((IDataParameter)cmd.Parameters[index + 1]).Value = pass.Salt; ((IDataParameter)cmd.Parameters[index + 2]).Value = pass.HashType; } } public Type ReturnedType { get { return typeof(Password); } } public global::NHibernate.SqlTypes.SqlType[] SqlTypes { get { global::NHibernate.SqlTypes.SqlType[] types = new global::NHibernate.SqlTypes.SqlType[3]; types[0] = new global::NHibernate.SqlTypes.SqlType(DbType.String); types[1] = new global::NHibernate.SqlTypes.SqlType(DbType.Int64); types[2] = new global::NHibernate.SqlTypes.SqlType(DbType.String); return types; } } }

Looks complicated, but it’s not.  Let’s break it down method by method.

public new bool Equals(object x, object y) – Returns whether object x and y are equal.  Why does it matter?  In our case, it really doesn’t (that I’m aware of); but NHibernate uses this to figure out the relationship between objects in your domain model.

public object DeepCopy(object value) – Creates a deep copy, I’m not sure why NHibernate needs this.  Note, in my implimentation of Password, I created a Copy method.  You could also create a new Password object, set the properties of that new object, and return that as well.  Something like this:

Password p = (Password)value;

Password result = new Password();

result.HashedPassword = p.HashedPassword;

result.HashType = p.HashType;

result.Salt = p.Salt;

return result;

 

I don’t know about you, but I prefer to encapsulate all this into the object itself :).

public int GetHashCode(object x) - Returns the hashcode for the object.

public bool IsMutable – Is this object mutable?  In our case, it doesn’t matter so we return false.

public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner) – This is where a lot of the magic happens :) First thing to do is check if the value from the database is null or empty, if it is, then we can return null and be done.  Second step, grab all the values from the data reader.

This is one of the things I don’t like about NHibernate, you have to get the values out by ordinal value.  Not only by the ordinal value, by in the same order they are mapped in the NHibernate mapping file (more on this later).  And finally, build and return a Password object.

public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) – This is the other half of the magic :) This code is fairly straight forward so I won’t bother to explain it.

public Type ReturnedType – Tells NHibernate what type of object will be returned by this CompositeUserType.

public global::NHibernate.SqlTypes.SqlType[] SqlTypes – Tells NHibernate what data types of each column is.  Again, the the columns are in ordinal order.  Why “the global::” you might ask?  Well, we have a class called NHibernate in our DataAccessLayer, so the global:: bit tells the C# compiler to backup and look in the global NHibernate namespace.  If you don’t have this issue, you can get rid of the global:: part.

 

Now, onto the Hibernate mapping file:

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="MyNamespace.DomainModel.UserCredential, MyNamespace.DomainModel" table="UserCredential" lazy="false"> <id name="Id" column="ID" type="Guid"> <generator class="guid.comb"/> </id> ... <property name="Password" type="MyNamespace.DataAccess.PasswordCompositeUserType, MyNamespace.DataAccess" > <column name="HashedPassword"/> <column name="Salt"/> <column name="HashType"/> </property> <property name="IsActive" /> </class> </hibernate-mapping>

Notice that the column order in the mapping file for our CompositeUserType in our mapping file is in the exact same order as in our PasswordCompositeUserType class.

 

I know this post was very long, but hopefully you found it useful and can adapt it to meet your specific needs!  Next up, using a NHibernate UserType to map the .NET IPAddress class to/from your database.


Questions, comments, please feel free to leave a comment.  This is my first article and I'd like as much feedback as possible!

posted on Saturday, December 30, 2006 11:58:24 PM (Alaskan Standard Time, UTC-09:00)  #    Comments [2]
Related posts:
LINQ Goodness
De-crapify your code base with AOP using PostSharp
Problems serializing class which inherits from a generic list
ASP.NET Resource Refactoring
Using Custom Attributes to Enable Quick Searching of Your Domain Entities With NHibernate
NHibernate, DateTime and UTC

Referred by:
http://www.dotnetkicks.com/upcoming [Referral]
http://www.dotnetkicks.com/csharp/CompositeUserTypes_in_NHib... [Referral]
http://www.dotnetkicks.com/ [Referral]
http://dotnetkicks.com/ [Referral]
http://www.dotnetkicks.com/page/2 [Referral]
http://dotnetkicks.com/page/2 [Referral]
http://www.dotnetkicks.com/tags/nhibernate [Referral]
nhibernate usertype (www.google.com) [Referral]
nhibernate guid comb (www.google.it) [Referral]
NHibernate make copy of object (www.google.com.au) [Referral]
hibernate mapping 2.2 (www.google.ca) [Referral]
http://www.dotnetkicks.com/page/3 [Referral]
NHibernate.SqlTypes.SqlType[] SqlTypes (www.google.ch) [Referral]
nhibernate usertype (www.google.com) [Referral]
sqltype + bit + nhibernate (www.google.com.ar) [Referral]
urn:nhibernate-mapping-2.2 (www.google.de) [Referral]
http://dotnetkicks.com/page/3 [Referral]
DbType NHIbernate (www.google.com) [Referral]
http://del.icio.us/tag/NHibernate [Referral]
NHibernate SQLTYpes (www.google.se) [Referral]
nhibernate guid generator (www.google.ru) [Referral]
nhibernate IUserType (www.google.com) [Referral]
http://www.dotnetkicks.com/csharp [Referral]
nhibernate (www.google.com) [Referral]
+mapping +interface +nhibernate (www.google.com) [Referral]
IDbCommand not found NHibernate (www.google.com.au) [Referral]
http://www.dotnetkicks.com/tags/NHIbernate [Referral]
NHibernate Domain Mapper (www.google.com.co) [Referral]
http://www.dotnetkicks.com/page/7 [Referral]
+nhibernate +namespace (www.google.com) [Referral]
nhibernate (blogsearch.google.com) [Referral]
c# equals nhibernate (www.google.no) [Referral]
NHibernate IUserType (www.google.com) [Referral]
"data types" nhibernate (www.google.pt) [Referral]
iusertype nhibernate (www.google.de) [Referral]
nhibernate copy an object (www.google.nl) [Referral]
http://www.dotnetkicks.com/tags/ORM [Referral]
http://www.dotnetkicks.com/users/akcoder [Referral]
nhibernate usertype (www.google.com) [Referral]
http://www.dotnetkicks.com/tags/DanMorphis [Referral]
nhibernate custom type (www.google.at) [Referral]
nhibernate GetHashCode (www.google.com.mx) [Referral]
enumeration c# nhibernate (www.google.it) [Referral]
nhibernate custom type password (www.google.com) [Referral]
nhibernate sql-type (www.google.com) [Referral]
nhibernate iusertype (www.google.com) [Referral]
hibernate CompositeUserType deep copy (www.google.co.uk) [Referral]
Return types nhibernate (www.google.fr) [Referral]
NHIBERNATE data types long (www.google.com) [Referral]
NHibernate Domain Mapper (www.google.es) [Referral]
nhibernate enum (www.google.com) [Referral]
NHibernate IUserType NullSafeSet (www.google.es) [Referral]
nhibernate IUserType nullSafeSet (www.google.com) [Referral]
"enumeration c#" (www.google.com.eg) [Referral]
check if string equals enum c# (www.google.com) [Referral]
NHibernate.IUserType (www.google.fr) [Referral]
http://www.dotnetkicks.com/page/13 [Referral]
domain object nhibernate (www.google.ro) [Referral]
nhibernate iusertype (www.google.de) [Referral]
"urn:nhibernate-mapping-2.2" (www.google.com) [Referral]
NHibernate Enum (www.google.com) [Referral]
nhibernate NullSafeSet (www.google.hu) [Referral]
IDataParameter nhibernate (www.google.com.br) [Referral]
NHibernate Domain Mapper (search.live.com) [Referral]
NHibernate NullSafeGet Enum (www.google.ru) [Referral]
NHibernate UTC (www.google.com) [Referral]
ICompositeUserType nhibernate (www.google.com) [Referral]
nhibernate DeepCopy (www.google.se) [Referral]
deep-copy in nhibernate (www.google.dk) [Referral]
c# nhibernate class where (www.google.de) [Referral]
nhibernate usertype (www.google.com) [Referral]
passwordsalt is NULL (www.google.nl) [Referral]
nhibernate IUserType (www.google.com) [Referral]
nhibernate implement Clone|Copy (www.google.com.vn) [Referral]
NHibernate nullsafeget (www.google.com) [Referral]
nhibernate usertype column (www.google.com) [Referral]
nhibernate hashcode equals (www.google.pl) [Referral]
http://en.blogoholix.com/usertype/ [Referral]
backup nhibernate (www.google.com) [Referral]
nhibernate namespace 2.2 (www.google.com) [Referral]
nhibernate copy object (search.live.com) [Referral]
nhibernate using an iusertype to map an enum (www.google.com) [Referral]
column sql-type nhibernate (www.google.it) [Referral]
ICompositeUserType NHibernate (www.google.com.tr) [Referral]
nhibernate enum (www.google.dk) [Referral]
class (search.live.com) [Referral]
global enum + C# (www.google.com.sg) [Referral]
CompositeUserType id property not found (www.google.com) [Referral]
nhibernate <column (www.google.com) [Referral]
nhibernate enum to column (www.google.com) [Referral]
NHibernate enums (www.google.ru) [Referral]
NHibernate Generic Enum String (www.google.co.uk) [Referral]
nhibernate 2.2 in C# (www.google.com) [Referral]
nhibernate domain (www.google.com) [Referral]
iusertype (www.google.co.uk) [Referral]
map tag nhibernate (www.google.com.au) [Referral]
nhibernate sql-type (www.google.com) [Referral]
nhibernate enum as string (www.google.co.id) [Referral]
nhibernate iusertype example (search.live.com) [Referral]
map enum to nhibernate (www.google.es) [Referral]
nhibernate column mapping (www.google.com) [Referral]
nhibernate generic domain object (www.google.ca) [Referral]
nhibernate usertype (www.google.com) [Referral]
Nhibernate SqlTypes (www.google.co.in) [Referral]
Hibernate 3 enumerated column value mapping (www.google.cz) [Referral]
SQLType DBType (www.google.de) [Referral]
Nhibernate sql-type (www.google.com.ua) [Referral]
nhibernate copy (www.google.com) [Referral]
nhibernate gethashcode (www.google.com) [Referral]
SqlTypes nhibernate (www.google.no) [Referral]
hibernate-mapping-2.2 (www.google.co.uk) [Referral]
nhibernate enum (www.google.de) [Referral]
CompositeUserTypes + hibernate (www.google.com) [Referral]
nhibernate sql-type (www.google.fr) [Referral]
IUserType nHibernet example (www.google.co.in) [Referral]
nhibernate enums (www.google.com) [Referral]
long type for NHibernate (www.google.com) [Referral]
nhibernate enum (www.google.com) [Referral]
using nhibernate with enumerations (www.google.com) [Referral]
nhibernate usertype (www.google.com) [Referral]
nhibernate mapping an enum to a database (www.google.se) [Referral]
how to do hibernate mapping for enum in c# (www.google.com) [Referral]
how to adapt nhibernate sql (www.google.be) [Referral]
nHibernate map index guid (www.google.com) [Referral]
NHibernate IUserType NullSafeSet (www.google.co.uk) [Referral]
hibernate-mapping-2.2 implements inherits (www.google.co.uk) [Referral]
nhibernate dk (www.google.com) [Referral]
nhibernate enumerations (www.google.de) [Referral]
passing parameters to nHibernate (www.google.com) [Referral]
nhibernate+enum+mapping (www.google.cz) [Referral]
nhibernate custom type mapper (www.google.co.za) [Referral]
one-to-one mapping in Nhibernate (www.google.com.tr) [Referral]
nhibernate mapping file properties (www.google.com) [Referral]
NHibernate enum string (www.google.com.vn) [Referral]
nhibernate generic objects (www.google.co.uk) [Referral]
nhibernate user type (www.google.com) [Referral]
nhibernate IUserType (www.google.com.au) [Referral]
nhibernate interface domain class (www.google.co.uk) [Referral]
NHibernate IUSerType (www.google.es) [Referral]
index nhibernate (www.google.lv) [Referral]
nhibernate hashcode (www.google.de) [Referral]
ICompositeUserType NHibernate (www.google.de) [Referral]
one-to-one nhibernet sample (www.google.com.co) [Referral]
GetHashCode() + nhibernate (www.google.com.ar) [Referral]
CompositeUserType +nhibernate (www.google.be) [Referral]
C# NET Nhibernate map xml generic class (www.google.cz) [Referral]
nhibernate enum ayende (www.google.com.tr) [Referral]
NHibernate enums (www.google.com) [Referral]
Nhibernate + one-to-one + property not found (www.google.fr) [Referral]
icompositeusertype nhibernate (www.google.com) [Referral]
nhibernate nullSafeGet (www.google.com) [Referral]
nhibernate icompositeusertype generate (www.google.com) [Referral]
Iusertype nhibernate (www.google.co.in) [Referral]
Iusertype nhibernate for id column (www.google.co.in) [Referral]
sql-type nhibernate (www.google.fr) [Referral]
nhibernate property data type map (www.google.com) [Referral]
deep copy c# nhibernate (www.google.com) [Referral]
nHibernate don't return null (www.google.com) [Referral]
nhibernate bit mapping (www.google.com) [Referral]
NHibernate NULL empty (www.google.com) [Referral]
nhibernate idbcommand parameter (www.google.com) [Referral]
nhibernate enum C# (www.google.bg) [Referral]
iusertype (www.google.fr) [Referral]
nhibernate user types (www.google.de) [Referral]
nhibernate map enum to table (www.google.de) [Referral]
indexed property nhibernate (www.google.com) [Referral]
ICompositeUserType nhibernate (www.google.com) [Referral]
nhibernate serialize classes sample (www.google.de) [Referral]
xmltype nhibernate iusertype (www.google.com) [Referral]
nhibernate User type (www.google.fr) [Referral]
nhibernate custom type (www.google.com) [Referral]
nhibernate map (www.google.com.au) [Referral]
Nhibernate, how to map enum types (www.google.pl) [Referral]
nhibernate return type (www.google.com.vn) [Referral]
nhibernate generic list index (www.google.de) [Referral]
nhibernate ipaddress (www.google.com) [Referral]
enum with nhibernate (www.google.com.ar) [Referral]
nhibernate enum (www.google.at) [Referral]
mapping enum nhibernate (www.google.at) [Referral]
nhibernate IUserType (www.google.co.nz) [Referral]
nhibernate datatype mappings bit (www.google.ie) [Referral]
Nhibernate empty criteria (www.google.pt) [Referral]
USERTYPES NHIBERNATE (www.google.es) [Referral]
sql-type nhibernate (www.google.ie) [Referral]
"property not found:" nhibernate (www.google.com) [Referral]
nhibernate iusertype (www.google.com) [Referral]
NHibernate IUSErType Password (www.google.com) [Referral]
IUserType nhibernate (www.google.co.in) [Referral]
ICompositeUserType nhibernate (www.google.com) [Referral]
copy object nhibernate (www.google.lt) [Referral]
nhibernate usertype (www.google.co.uk) [Referral]
nhibernate IUserType (www.google.co.uk) [Referral]
one-to-one nhibernet (www.google.com) [Referral]
nullsafeget nhibernate (www.google.com) [Referral]
nhibernate datatypes (www.google.ca) [Referral]
c# clone nhibernate (www.google.ca) [Referral]
google.co.id magic (www.google.co.id) [Referral]
nhibernate enum custom user type (www.google.com) [Referral]
NHibernate enum custom type (www.google.com) [Referral]
nhibernate custom id generator (www.google.bg) [Referral]
nhibernate +enum +mapping (www.google.at) [Referral]
nhibernate mapping long (search.yahoo.com) [Referral]
nhibernate enum custom type (www.google.nl) [Referral]
nhibernate usertype IsSerializable (www.google.com) [Referral]
IUserType nHibernate (www.google.com.br) [Referral]
nhibernate enum map int (www.google.com.br) [Referral]
nhibernate serialize (www.google.com) [Referral]
NHibernate map one-to-one table (www.google.ru) [Referral]
nhibernate usertype (www.google.com) [Referral]
nhibernate one-to-one (www.google.fr) [Referral]
hibernate-mapping-2.2 (www.google.com.vn) [Referral]
nhibernate sqltype (www.google.co.uk) [Referral]
nhibernate "property not found" id (www.google.com) [Referral]
sql-type nhibernate xml (www.google.com) [Referral]
nhibernate map datatypes (www.google.com) [Referral]
nhibernate false objects (www.google.com.au) [Referral]
iusertype nhibernate (www.google.com) [Referral]
NHibernate SqlType (www.google.com.sg) [Referral]
nhibernate mapping enum property (www.google.de) [Referral]
NHibernate usertype (www.google.com.by) [Referral]
NHibernate query return types (www.google.co.uk) [Referral]
nhibernate custom value types (www.google.com.uy) [Referral]
Nhibernate enum mapping (www.google.com) [Referral]
custom type nhibernate (www.google.it) [Referral]
nhibernate sql-type (www.google.se) [Referral]
nhibernate "<map" index id (www.google.pl) [Referral]
nhibernate xmltype (www.google.com) [Referral]
nhibernate sqltype (www.google.co.uk) [Referral]
NHibernate enum (www.google.com) [Referral]
custom type nhibernate (www.google.it) [Referral]
NHibernate NullSafeGet (www.google.com.ar) [Referral]
user type nhibernate (www.google.it) [Referral]
nhibernate interface (www.google.com.sg) [Referral]
enumeration table nhibernate mapping (www.google.ca) [Referral]
nhibernate usertype parameters (www.google.com) [Referral]
nhibernate user type (www.google.com.ar) [Referral]
nhibernate mapper (www.google.no) [Referral]
IdbCommand Nhibernate (www.google.it) [Referral]
nhibernate mapping id type with parameters (www.google.com) [Referral]
NHibernate SqlType (www.google.com) [Referral]
How to map data BLOG type in NHibernate (www.google.com.vn) [Referral]
class (search.live.com) [Referral]
nhibernate map (www.google.com.ar) [Referral]
NHibernate IUserType for id (search.yahoo.com) [Referral]
nhibernate create id generator (www.google.nl) [Referral]
hibernate-mapping enum set (www.google.com) [Referral]
Nhibernate column "sql-type" (www.google.com.sg) [Referral]
NHibernate column Guid (www.google.com) [Referral]
nhibernate mapping enum list (www.google.com.au) [Referral]
nhibernate equals (search.ie7pro.com) [Referral]
GetHashCode nhibernate (search.ie7pro.com) [Referral]
nhibernate mapping enum (www.google.se) [Referral]
NHibernate any id-type IUserType (www.google.com) [Referral]
nhibernate "user type" (www.google.co.uk) [Referral]
nhibernate iusertype (www.google.com) [Referral]
nhibernate sql-type (www.google.de) [Referral]
extra Relationship values NHibernate (www.google.co.th) [Referral]
serializing class "inherits from a generic list" (www.google.de) [Referral]
NHibernate IUserType SqlTypes (www.google.com.by) [Referral]
nhibernate deepcopy (www.google.fr) [Referral]
build nhibernate map from sql (www.google.co.uk) [Referral]
nhibernate mapper bit (www.google.it) [Referral]
mapping bool nhibernate (www.google.it) [Referral]
nhibernate dbtype (www.google.com.br) [Referral]
nhibernate one-to-one (www.google.ru) [Referral]
nhibernate bool bit (www.google.com) [Referral]
NHibernate bit (www.google.com) [Referral]
asp.net rs.getordinal c# (www.google.com) [Referral]
NHibernate query return type (www.google.com) [Referral]
nhibernate id-type (www.google.com) [Referral]
nhibernate one-to-one example (www.google.cz) [Referral]
nhibernate IUserType nullsafeGet (www.google.co.il) [Referral]
NHibernate datatype int (www.google.com.br) [Referral]
user type nhibernate (www.google.com.vn) [Referral]
Enum nhibernate (www.google.co.uk) [Referral]
enum Nhibernate (www.google.co.uk) [Referral]
how to map bit nhibernate (www.google.it) [Referral]
NHibernate.SqlTypes (www.google.com.au) [Referral]
nhibernate IUserType (www.google.com) [Referral]
nhibernate generic enum mapper (www.google.se) [Referral]
nhibernate one-to-one (www.google.com.ar) [Referral]
IUserType nhibernate (www.google.co.uk) [Referral]
nhibernate interface (www.google.com.au) [Referral]
NHibernate guid.comb (www.google.com) [Referral]
IUserType Hibernate (www.google.com) [Referral]
using CompositeUserType = NHibernate.ICompositeUserType; (www.google.com) [Referral]
NHibernate guid.comb sql-type (www.google.com) [Referral]
nhibernate compositeusertype (www.google.com.au) [Referral]
nhibernate bit (www.google.com.br) [Referral]
Lazy clone nhibernate (www.google.ca) [Referral]
"example IDbCommand in Nhibernate" (www.google.com.vn) [Referral]
UserType sqlTypes blank (www.google.fr) [Referral]
nhibernate mapping enum (www.google.com) [Referral]
nhibernate sql types (www.google.pl) [Referral]
nhibernate generic.list (www.google.com) [Referral]
"property not found: id" (www.google.co.uk) [Referral]
nhibernate custom (www.google.ru) [Referral]
nhibernate sql bit (www.google.ca) [Referral]
nhibernate one to one int (www.google.co.uk) [Referral]
nhibernate one-to-one (www.google.de) [Referral]
NHibernate.Search "Indexed" (www.google.com) [Referral]
nhibernate equals (www.google.fr) [Referral]
nhibernate mapping id custom generator (www.google.com) [Referral]
nhibernate one-to-one (www.google.de) [Referral]
nhibernate enum C# (www.google.com) [Referral]
nhibernate serialize data (www.google.com.au) [Referral]
nhibernate returntypes (www.google.be) [Referral]
Nhibernate custom enum IUserType c# (www.google.com) [Referral]
nhibernate "value mapping" (www.google.com) [Referral]
nhibernate two mapping files one table (www.google.com) [Referral]
nhibernate datatype (www.google.com.ar) [Referral]
nhibernate IDbCommand implementation not found (www.google.com.cu) [Referral]
nhibernate equals gethashcode (www.google.de) [Referral]
nhibernate gethashcode (www.google.com) [Referral]
mapping nhibernate generate (www.google.com) [Referral]
nhibernate bit (www.google.com) [Referral]
nhibernate one-to-one (www.google.de) [Referral]
NHibernate results column order (www.google.com) [Referral]
IDbCommand nhibernate example (www.google.pl) [Referral]
nhibernate enum and database (www.google.fr) [Referral]
nhibernate "custom type" example (www.google.ch) [Referral]
nhibernate IUserType (www.google.co.uk) [Referral]
nhibernate one-to-one (www.google.co.uk) [Referral]
nhibernate ICompositeUserType (www.google.com) [Referral]
copy nhibernate object (www.google.com.vn) [Referral]
nhibernate OneToOne (www.google.com.au) [Referral]
nhibernate copy object (www.google.pl) [Referral]
nhibernate ipaddress (www.google.com) [Referral]
nhibernate how to map generic classes (www.google.com) [Referral]
nullsafeset nhibernate (www.google.com) [Referral]
Nhibernate NullSafeGet (www.google.com.hk) [Referral]
nhibernate SqlTypes (www.google.com.au) [Referral]
nhibernate sqltype (www.google.com.au) [Referral]
nhibernate usertypes (www.google.co.nz) [Referral]
nhibernate "custom id generator" (www.google.se) [Referral]
nhibernate one-to-one (www.google.co.uk) [Referral]
nhibernate enum (www.google.cn) [Referral]
nhibernate custom mapping type (www.google.co.uk) [Referral]
Nhibernate one-to-one (www.google.co.uk) [Referral]
nhibernate deep copy object (www.google.be) [Referral]
nhibernate one-to-one column mapping (www.google.com) [Referral]
enum map nhibernate (www.google.com.br) [Referral]
nhibernate usertype ipaddress (www.google.com) [Referral]
NHibernate "one to one" (search.live.com) [Referral]
"deep copy" nHibernate (www.google.com) [Referral]
NHibernate bool (www.google.pl) [Referral]
NHibernate GUID column (www.google.com) [Referral]
NHibernate UserType example (www.google.co.za) [Referral]
nhibernate column sql-type (www.google.com) [Referral]
Nhibernate nullSafeGet (www.google.cn) [Referral]
nhibernate "custom id" generator (www.google.de) [Referral]
user type nhibernate (www.google.nl) [Referral]
IDbCommand nhibernate (www.google.de) [Referral]
nhibernate enum mapping (www.google.pl) [Referral]
iusertype nhibernate (www.google.com) [Referral]
UserType Example nhibernate (www.google.com) [Referral]
NHibernate Custom Value Type (www.google.com) [Referral]
sqltype nhibernate (www.google.com) [Referral]
NHibernate DeepCopy (www.google.se) [Referral]
NHibernate enum mapping (www.google.com) [Referral]
nhibernate interface mapping (www.google.com) [Referral]
Nhibernate copy object (www.google.be) [Referral]
custom type NHibernate IUserType enum (www.google.ru) [Referral]
nhibernate sqltype (www.google.it) [Referral]
IUserType NHibernate (www.google.it) [Referral]
nhibernate this copy object (www.google.se) [Referral]
nhibernate one to one (www.google.com) [Referral]
NHibernate CLONE (www.google.fr) [Referral]
nhibernate bool (www.google.pl) [Referral]
nhibernate value objects (www.google.dk) [Referral]
one-to-one, nhibernate (www.google.com) [Referral]
IUserType NHibernate (www.google.com) [Referral]
NHibernate IUserType enum (www.google.de) [Referral]
sql nhibernate one-to-one (www.google.ca) [Referral]
nhibernate hashcode (www.google.com) [Referral]
nhibernate "custom type" Null empty valuetype (www.google.com) [Referral]
Icompositeusertype (www.google.com) [Referral]
IUserType nhibernate long (www.google.co.in) [Referral]
castle activerecord map string enum (www.google.nl) [Referral]
copy object nhibernate (www.google.fr) [Referral]