使用NHibernate / Castle ActiveRecord将枚举映射到数据库

时间:2010-06-05 03:31:09

标签: c# nhibernate castle-activerecord

还有一些关于使用ActiveRecord将枚举映射到数据库的其他帖子,但没有一个回答我的问题。我有一个名为OrderState的枚举:

public enum OrderState {InQueue, Ordered, Error, Cancelled}

我在桌子上有以下属性:

[Property(NotNull = true, SqlType = "orderstate", ColumnType = "DB.EnumMapper, WebSite")]
public OrderState State
{
   get { return state; }
   set { state = value; }
}

我有以下类型类:

public class EnumMapper : NHibernate.Type.EnumStringType<OrderState>
{
   public EnumMapper()
   {
   }

   public override NHibernate.SqlTypes.SqlType SqlType
   {
      get
      {
         return new NHibernate.SqlTypes.SqlType(DbType.Object);
      }
   }
}

现在这实际上是按照我想要的方式工作,但问题是我有大量的枚举,我不想为每一个创建一个EnumMapper类。有没有办法告诉ActiveRecord使用DbType.Object进行任何枚举?它似乎想要是一个整数或字符串,但没有别的。这一次让我在过去的两个小时里疯狂了..

麦克

3 个答案:

答案 0 :(得分:2)

编写一个覆盖SqlType的通用EnumStringType,然后应用它:

public class EnumMapper<T> : NHibernate.Type.EnumStringType<T>
{
   public EnumMapper()
   {
   }

   public override NHibernate.SqlTypes.SqlType SqlType
   {
      get
      {
         return new NHibernate.SqlTypes.SqlType(DbType.Object);
      }
   }
}

申请:

[Property(NotNull = true, 
          ColumnType = "MyNamespace1.EnumMapper`1[MyNamespace2.OrderState, MyAssembly2], MyNamespace1")]
public OrderState State {get;set;}

答案 1 :(得分:0)

除非我遗漏了什么,否则你可以这样做:

public enum ExampleEnum
{ 
    Value1,
    Value2
}

[ActiveRecord]
public class ExampleClass 
{
    [PrimaryKey]
    public int ID { get; set; }

    [Property]
    public ExampleEnum Example { get; set; }
}

似乎对我有用。

答案 2 :(得分:-1)

ColumnType = typeof(EnumStringType<OrderState>).AssemblyQualifiedName