将Enum映射为NHibernate 3.2中的字符串,按代码映射

dst*_*stj 23 nhibernate nhibernate-mapping

通过代码使用NHibernate 3.2映射(不是fluent-nhibernate),我试图将Enum字段映射到字符串列而不是默认的int表示.我无法获得正确的语法.

例如:

    public class Account {
        public enum StateType { Pending, Active, Cancelled, Suspended }
        ...
        public virtual StateType State { get; set; }
        ...
    }
Run Code Online (Sandbox Code Playgroud)

在XML映射中,您可以使用NHibernate.Type.EnumStringType(请参阅此链接),但如何通过代码进行映射?

    NHibernate.Mapping.ByCode.ModelMapper mapper = new NHibernate.Mapping.ByCode.ModelMapper();

    mapper.Class<Account>(map => {
        map.Id(x => x.Id, attr => {
            attr.Column("id");
            attr.Generator(NHibernate.Mapping.ByCode.Generators.Identity);
        });
        // Default 'int' mapping
        //map.Property(x => x.State);

        // Cannot implicitly convert type 'StateType' to 'NHibernate.Type.EnumStringType'
        //map.Property<NHibernate.Type.EnumStringType<Account.StateType>>(x => x.State); 
Run Code Online (Sandbox Code Playgroud)

更新:

使用此映射,我设法将其作为字符串保存到数据库中,但是现在从DB加载到对象模型时会出现异常.

map.Property(x => x.State, attr => { attr.Type(NHibernateUtil.String); });

这是我在尝试加载对象时遇到的异常:

Invalid Cast (check your mapping for property type mismatches); setter of Model.Account
Run Code Online (Sandbox Code Playgroud)

dst*_*stj 27

得到它了!以下语法有效:

map.Property(x => x.State, attr => attr.Type<NHibernate.Type.EnumStringType<Account.StateType>>());