2010-06-05 109 views
3

還有一些關於使用ActiveRecord將數據映射到數據庫的文章,但是他們都沒有回答我的問題。我有一個名爲OrderState枚舉:使用NHibernate/Castle將枚舉映射到數據庫ActiveRecord

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小時以來..

邁克

回答

2

編寫一個通用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

不,您必須重寫SqlType。否則,它將插入的SQL語句爲: INSERT INTO TestTable(State,Id)VALUES('Preview':: text, '9dea2a34-566a-45ea-84fd-24b86403ef5b':: uuid) – Mike 2010-06-07 10:56:06

+0

@Mike:ok ,當您使用數據庫枚舉類型時,有必要覆蓋它。我相應地改變了我的答案。 – 2010-06-07 13:22:33

-1
ColumnType = typeof(EnumStringType<OrderState>).AssemblyQualifiedName 
+0

謝謝,這有所幫助。但是,您不能直接使用EnumStringType,因爲它會嘗試將其轉換爲「文本」數據類型並導致SQL錯誤。這就是爲什麼你必須重寫SqlType並使其成爲DbTYpe.Object。我弄明白我可以這樣做: [Property(SqlType =「TestEnum」,ColumnType =「DB.PgEnumMapper'1 [DB.OrderState,WebSite],WebSite」)] ...但你的方式有點兒更清潔.. – Mike 2010-06-07 10:54:39

+0

.Net不允許這樣做,因爲屬性屬性值必須是靜態常量表達式:「屬性參數必須是常量表達式,typeof表達式或屬性參數類型的數組創建表達式」。如果ColumnType的類型是System.Type,它將被接受(雖然沒有「AssemblyQualifiedName」) – 2010-06-07 12:48:07

0

除非我錯過了一些東西,你可以這樣做:

public enum ExampleEnum 
{ 
    Value1, 
    Value2 
} 

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

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

似乎完全適合我。

+0

是的,它確實可以工作,但它將映射到數據庫中的數字數據類型。我試圖將其映射到數據庫中的ENUM類型。我最終得到了它的工作,但它非常棘手。 – 2010-11-12 04:17:15