Отображение перечислений в базу данных с помощью NHibernate / Castle ActiveRecord - PullRequest
3 голосов
/ 05 июня 2010

Есть несколько других постов по сопоставлению Enums с БД с 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 для любого перечисления? Кажется, он либо хочет быть целым числом, либо строкой, но не более того. Этот сводит меня с ума в течение последних 2 часов ..

Mike

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

Напишите универсальный EnumStringType, который переопределяет SqlType, затем примените его:

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;}
0 голосов
/ 11 ноября 2010

Если я что-то упустил, вы можете просто сделать это:

public enum ExampleEnum
{ 
    Value1,
    Value2
}

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

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

Кажется, отлично работает для меня.

0 голосов
/ 07 июня 2010
ColumnType = typeof(EnumStringType<OrderState>).AssemblyQualifiedName
...