Fluent Nhibernate Enum Mapping



我在流利的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);
        ...
    }
}

postgres enum type

CREATE TYPE content.enum_publication_status AS ENUM('on_moderation', 'active', ...);

但是当我试图保存时,Postgres 扔了这个

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

有什么建议吗?

下面是配置 nhibernate 以存储枚举字段的工作示例。

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();
            }
        }
    }
}

在这种情况下,它以字符串的形式存储在数据库中。如果要将其另存为整数,则需要将 Enum 字段属性的映射更改为以下内容:

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

为什么要在程序中创建枚举类型? 这不是维护噩梦吗?您的配置是什么样的?您是否已经尝试使用此处描述的约定?看起来像一个简单的转换错误,所以请考虑在你的映射中使用 CustomType()/CustomSQLType()。

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

public class PgEnumMapper<T> : NHibernate.Type.EnumStringType<T>
{
   public override NHibernate.SqlTypes.SqlType SqlType
   {
      get { return new NHibernate.SqlTypes.SqlType(System.Data.DbType.Object); }
   }
}

然后,您可以使用:

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

最新更新