Então, como mencionei, tirar a versão mais recente do Fluent NHibernate do porta-malas me levou aonde eu precisava estar. Um exemplo de mapeamento para um enum com o código mais recente é:
Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));
O tipo personalizado força-o a ser tratado como uma instância do enum em vez de usar o GenericEnumMapper<TEnum>
.
Na verdade, estou pensando em enviar um patch para poder alterar entre um mapeador enum que persiste uma string e um que persiste um int, pois isso parece algo que você deve ser capaz de definir como uma convenção.
Isso apareceu na minha atividade recente e as coisas mudaram nas versões mais recentes do Fluent NHibernate para tornar isso mais fácil.
Para fazer com que todos os enums sejam mapeados como inteiros, agora você pode criar uma convenção como esta:
public class EnumConvention : IUserTypeConvention
{
public bool Accept(IProperty target)
{
return target.PropertyType.IsEnum;
}
public void Apply(IProperty target)
{
target.CustomTypeIs(target.PropertyType);
}
public bool Accept(Type type)
{
return type.IsEnum;
}
}
Então, seu mapeamento só precisa ser:
Map(quote => quote.Status);
Você adiciona a convenção ao seu mapeamento do Fluent NHibernate assim;
Fluently.Configure(nHibConfig)
.Mappings(mappingConfiguration =>
{
mappingConfiguration.FluentMappings
.ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
})
./* other configuration */