2013-06-25 49 views
0

我有一個這樣的模型:如何最好地將值轉換注入NHibernate屬性?

public class Order 
{ 
    public virtual int OrderType { get; set; } 
} 

(大量省略當然其它性質的),其直接映射到在DB的int類型。

事情是,數字訂單類型對我的應用程序沒有意義。用戶看到的單字母代碼表示訂單類型。所以,我可以做這樣的事情:

public class Order 
{ 
    public virtual int OrderTypeIgnored { get; set; } 
    public virtual char OrderType 
    { 
     get 
     { 
      return translateForward(OrderTypeIgnored); 
     } 
     set(char val) 
     { 
      OrderTypeIgnored = translateBackward(val); 
     } 
    } 
} 

(大量空氣碼/僞那裏,我是比較新的C#),只是映射OrderTypeIgnored財產。但有沒有更乾淨的方法來做到這一點?也許以某種方式覆蓋映射屬性本身的getter和setter?

一些注意事項:這些值足夠靜態,以便將代碼嵌入到代碼中不是問題。不,沒有LOV表,不,我無法控制數據庫結構。

對不起,如果有這個答案,但搜索像「映射」和「翻譯」的東西並不真正讓我看到的結果,顯然。

回答

0

您可以創建一個公共char屬性,該屬性使用專用int字段並僅映射該字段。

型號:

public class Order 
{ 
    private int _orderType; 
    public virtual char OrderType 
    { 
     get 
     { 
      return TranslateForward(_orderType); 
     } 
     set 
     { 
      _orderType = TranslateBackward(value); 
     } 
    } 
} 

映射:

<property name="_orderType" access="field" /> 

如果你不希望到現場直接映射(因爲你使用編譯安全映射),您可以使用公共屬性映射訪問策略「字段」,像「camelcase-underscore」這樣的命名策略,並明確指定「Int32」類型。

0

對於這種情況,您總是可以使用enums

你可以這樣定義它:

namespace MyApp.Domain 
{ 
    using System.ComponentModel; 

    public enum OrderType : short 
    { 
     [Description("Order Suspended")] 
     Suspended = 1, 
     [Description("Order Delivered")] 
     Delivered = 2, 
     [Description("Order New")] 
     Inserted = 3 
    } 
} 

和地圖這樣說:

<property name="Type" type="MyApp.Domain.OrderType, MyApp.Domain" > 
    <column name="Type" not-null="true"/> 
</property> 

所以你可以寫你的QueryOver在這樣一個簡單的方法:

var orders = this.Session.QueryOver<MyApp.Domain.Orders>() 
       .Where(x => x.Type == MyApp.Domain.OrderType.Inserted) 
       .List(); 
相關問題