cbp
cbp

Reputation: 25628

Mapping enums as varchar instead of nvarchar in NHibernate

In Fluent NHibernate, does anyone know if it is possible to map an enum as a varchar instead of nvarchar column.

I can map an enum as an int or nvarchar, but not an ANSI string varchar.

Upvotes: 0

Views: 640

Answers (1)

Onur Gumus
Onur Gumus

Reputation: 1439

There is no builtin type for this in nhibernate. You can use the following type to achieve it:

    [Serializable]
    public abstract class EnumAnsiStringType : AbstractEnumType
    {
        public const int MaxLengthForEnumString = 255;
        protected EnumAnsiStringType(Type enumClass)
            : this(enumClass, MaxLengthForEnumString) { }
        protected EnumAnsiStringType(Type enumClass, int length)
            : base(SqlTypeFactory.GetAnsiString(length), enumClass) { }
        public override string Name
        {
            get { return "enumstring - " + ReturnedClass.Name; }
        }
        public virtual object GetInstance(object code)
        {
            //code is an named constants defined for the enumeration.
            try
            {
                return StringToObject(code as string);
            }
            catch (ArgumentException ae)
            {
                throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, ReturnedClass.Name), ae);
            }
        }
        public virtual object GetValue(object code)
        {
            //code is an enum instance.
            return code == null ? string.Empty : Enum.Format(ReturnedClass, code, "G");
        }
        public override void Set(IDbCommand cmd, object value, int index)
        {
            var par = (IDataParameter)cmd.Parameters[index];
            if (value == null)
            {
                par.Value = DBNull.Value;
            }
            else
            {
                par.Value = GetValue(value);
            }
        }
        public override object Get(IDataReader rs, int index)
        {
            object code = rs[index];
            if (code == DBNull.Value || code == null)
            {
                return null;
            }
            else
            {
                return GetInstance(code);
            }
        }
        public override object Get(IDataReader rs, string name)
        {
            return Get(rs, rs.GetOrdinal(name));
        }
        public override string ToString(object value)
        {
            return (value == null) ? null : GetValue(value).ToString();
        }
        public override object Assemble(object cached, ISessionImplementor session, object owner)
        {
            if (cached == null)
            {
                return null;
            }
            return GetInstance(cached);
        }
        public override object Disassemble(object value, ISessionImplementor session, object owner)
        {
            return (value == null) ? null : GetValue(value);
        }
        public override string ObjectToSQLString(object value, NHibernate.Dialect.Dialect dialect)
        {
            return GetValue(value).ToString();
        }
    }
}

Upvotes: 1

Related Questions