Fluent Nhibernate枚举映射

Fluent Nhibernate枚举映射,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我对fluent NHibernate中的enum映射有一些问题。我知道这个问题已经被问过很多次了,但我找不到任何适合我的解决方案。我是NHibernate的新手,看起来我可能错过了一些简单而愚蠢的事情。这是我的密码 public class DBPublication { public virtual int pub_id { get; set; } public virtual PublicationStatuses status { get; set; } ...

我对fluent NHibernate中的
enum
映射有一些问题。我知道这个问题已经被问过很多次了,但我找不到任何适合我的解决方案。我是NHibernate的新手,看起来我可能错过了一些简单而愚蠢的事情。这是我的密码

public class DBPublication
{
    public virtual int pub_id { get; set; }
    public virtual PublicationStatuses status { get; set; }
    ...
}

public enum PublicationStatuses 
{
    on_moderation,
    active,
    ...
}


public class DBPublicationMap : ClassMap<DBPublication>
{
    public DBPublicationMap()
    {
        Table("content.publications");
        Id(x => x.pub_id).GeneratedBy.Sequence("content.pub_sq");           
        Map(x => x.status);
        ...
    }
}
但当我试图保存时,博士后会抛出这个

column "status" is of type content.enum_publication_status but expression is of type text

有什么建议吗?

为什么要在progres中创建枚举类型?这不是一场维护噩梦吗? 您的配置是什么样子的?您是否已经尝试过使用所描述的约定?
看起来是一个简单的铸造错误,所以请考虑在映射中使用CuthType()/CuffSql类型(.p/> < P>)。这里是配置NHiBiNATE以存储EnUM字段的工作示例。
public class Entity
{
    public virtual int id { get; set; }

    public virtual SomeEnum EnumField { get; set; }
}

public enum SomeEnum
{
    Value1,
    Value2
}

class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Id(x => x.id).GeneratedBy.Native();
        Map(x => x.EnumField);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var factory = Fluently.Configure().Mappings(x => x.FluentMappings.AddFromAssemblyOf<Entity>())
                                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
                                .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Data Source=.;Initial Catalog=nhtest;Integrated Security=True"))
                                .BuildSessionFactory();
        using (var session = factory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var entity = new Entity();
                entity.EnumField = SomeEnum.Value2;
                session.Save(entity);
                transaction.Commit();
            }
        }

    }
}
公共类实体
{
公共虚拟整数id{get;set;}
公共虚拟SomeEnum枚举字段{get;set;}
}
公共枚举SomeEnum
{
价值1,
价值2
}
类EntityMap:ClassMap
{
公共实体映射()
{
Id(x=>x.Id).GeneratedBy.Native();
映射(x=>x.EnumField);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var factory=fluent.Configure().Mappings(x=>x.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(config=>newschemaexport(config).Create(false,true))
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(“数据源=;初始目录=nhtest;集成安全性=True”))
.BuildSessionFactory();
使用(var session=factory.OpenSession())
{
使用(var transaction=session.BeginTransaction())
{
var实体=新实体();
entity.EnumField=SomeEnum.Value2;
session.Save(实体);
Commit();
}
}
}
}
在这种情况下,它作为字符串存储在数据库中。如果要将其另存为整数,则需要将“枚举字段”属性的映射更改为以下内容:

Map(x => x.EnumField).CustomType<int>();
Map(x=>x.EnumField).CustomType();

只需将此类添加到项目中:

public class PgEnumMapper<T> : NHibernate.Type.EnumStringType<T>
{
   public override NHibernate.SqlTypes.SqlType SqlType
   {
      get { return new NHibernate.SqlTypes.SqlType(System.Data.DbType.Object); }
   }
}
公共类PgEnumMapper:NHibernate.Type.EnumStringType
{
公共重写NHibernate.SqlTypes.SqlType SqlType
{
获取{返回新的NHibernate.SqlTypes.SqlType(System.Data.DbType.Object);}
}
}
然后,您可以使用:

Map(x => x.status).CustomType<PgEnumMapper<PublicationStatuses>>();
Map(x=>x.status).CustomType();

u解决方案仅适用于表列类型为整数的情况,但我需要自定义postgres枚举类型,因此我得到了另一个例外:“column”status“的类型为content.enum\u publication\u status,但表达式的类型为integer”,但还是要感谢您。我想我只需要更改列类型并忘掉它:)您能给出一个按特定的
PublicationStatus
进行选择的示例吗?
Map(x => x.status).CustomType<PgEnumMapper<PublicationStatuses>>();