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 the nhibernate configuration section:

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

So when I request:

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

I have an exception:

 Type mismatch in NHibernate.Criterion.SimpleExpression: UserRole expected type System.Int32, actual type XXX.XXX.UserRole (which is enum type class) 
+6
source share
1 answer

If you want to keep the int value for an enumeration, the mapping is simple:

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

No need for EnumConvention.

+8
source

All Articles