Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enum Type mismatch in Fluent NHibernate (ASP.NET MVC)

Table Model:

public class UserOwnerShip
{
    public virtual int Id { get; set; }
    public virtual User User { get; set; }
    public virtual City City { get; set; }
    public virtual Company Company { get; set; }
    public virtual UserRole UserRole { get; set; }
    public virtual DateTime RegistryDate { get; set; }
    public virtual bool IsActive { get; set; }
}

Mapping:

internal class UserOwnerShipMap : ClassMap<UserOwnerShip>
{
    public UserOwnerShipMap()
    {
        Id(x => x.Id);
        Map(x => x.IsActive);
        Map(x => x.UserRole).CustomType(typeof(int));
        Map(x => x.RegistryDate);

        References(x => x.User).Not.Nullable();
        References(x => x.City).Nullable();
        References(x => x.Company).Nullable();
    }
}

My EnumConvention Class :

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum ||
            (x.Property.PropertyType.IsGenericType &&
             x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
             x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
            );
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}

And UserRole Enum

public enum UserRole
{
    User,
    Operator,
    Manager,
    Manager,
    Admin
}

And my nhibernate config section :

....().Conventions.AddFromAssemblyOf<EnumConvention>())

So when I query :

    IList<UserOwnerShip> userOwnerShip = session.QueryOver<UserOwnerShip>()
                                                    .Where(u => u.UserRole == UserRole.Owner)
                                                    .Where(u => u.IsActive)
                                                    .List<UserOwnerShip>();

I got exception:

Type mismatch in NHibernate.Criterion.SimpleExpression: UserRole expected type System.Int32, actual type XXX.XXX.UserRole (which is enum type class)
like image 904
gandil Avatar asked Jan 15 '13 00:01

gandil


1 Answers

If you want to store the int value of the enum, the mapping is simply:

Map(x => x.UserRole).CustomType<UserRole>();

There's no need for the EnumConvention.

like image 133
Jamie Ide Avatar answered Nov 17 '22 09:11

Jamie Ide