How do I create/use a Fluent NHibernate convention to automap UInt32 properties to an SQL Server 200

Posted by dommer on Stack Overflow See other posts from Stack Overflow or by dommer
Published on 2010-05-13T13:54:31Z Indexed on 2010/05/13 23:54 UTC
Read the original article Hit count: 235

I'm trying to use a convention to map UInt32 properties to a SQL Server 2008 database. I don't seem to be able to create a solution based on existing web sources, due to updates in the way Fluent NHibernate works - i.e. examples are out of date.

I'm trying to have NHibernate generate the schema (via ExposeConfiguration). I'm happy to have NHibernate map it to anything sensible (e.g. bigint).

Here's my code as it currently stands (which, when I try to expose the schema, fails due to SQL Server not supporting UInt32). Apologies for the code being a little long, but I'm not 100% sure what is relevant to the problem, so I'm erring on the side of caution. Most of it is based on this post.

The error reported is:

System.ArgumentException : Dialect does not support DbType.UInt32

I think I'll need a relatively comprehensive example, as I don't seem to be able to pull the pieces together into a working solution, at present.

FluentConfiguration configuration =
    Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(connectionString))
        .Mappings(mapping =>
            mapping.AutoMappings.Add(
                AutoMap.AssemblyOf<Product>()
                    .Conventions.Add<UInt32UserTypeConvention>()));

configuration.ExposeConfiguration(x => new SchemaExport(x).Create(false, true));

namespace NHibernateTest
{
    public class UInt32UserTypeConvention : UserTypeConvention<UInt32UserType> 
    {
        // Empty.
    }
}

namespace NHibernateTest
{
    public class UInt32UserType : IUserType
    {
        // Public properties.

        public bool IsMutable
        {
            get
            {
                return false;
            }
        }

        public Type ReturnedType
        {
            get
            {
                return typeof(UInt32);
            }
        }

        public SqlType[] SqlTypes
        {
            get
            {
                return 
                    new SqlType[] 
                    { 
                        SqlTypeFactory.Int32 
                    };
            }
        }

        // Public methods.

        public object Assemble(object cached, object owner)
        {
            return cached;
        }

        public object DeepCopy(object value)
        {
            return value;
        }

        public object Disassemble(object value)
        {
            return value;
        }

        public new bool Equals(object x, object y)
        {
            return (x != null && x.Equals(y));
        }

        public int GetHashCode(object x)
        {
            return x.GetHashCode();
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            int? i = (int?)NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
            return (UInt32?)i;
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            UInt32? u = (UInt32?)value;
            int? i = (Int32?)u;
            NHibernateUtil.Int32.NullSafeSet(cmd, i, index);
        }

        public object Replace(object original, object target, object owner)
        {
            return original;
        }
    }
}

© Stack Overflow or respective owner

Related posts about fluent-nhibernate

Related posts about nhibernate