【问题标题】:Fluent Nhibernate Enum Mapping流畅的 Nhibernate 枚举映射
【发布时间】:2014-06-23 14:28:53
【问题描述】:

我对流利的 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 枚举类型

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 fluent-nhibernate


    【解决方案1】:

    这是一个配置 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>();
    

    【讨论】:

    • u 解决方案仅在表列类型为整数但我需要自定义 postgres 枚举类型时才有效,所以我得到了另一个例外:“列“状态”是 content.enum_publication_status 类型,但表达式是类型整数”,但还是谢谢你。我想我只需要更改列类型并忘记它:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你能举一个按特定PublicationStatus选择的例子吗?
      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2023-03-14
      • 2010-11-22
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多