如何最好地将值转换注入NHibernate属性?

时间:2013-06-25 11:18:42

标签: nhibernate

我有一个这样的模型:

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

(当然省略了很多其他属性),它们直接映射到数据库中的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表,不,我无法控制数据库结构。

很抱歉,如果有这方面的答案,但搜索“映射”和“翻译”之类的内容并不能真正让我得到我正在寻找的结果。

2 个答案:

答案 0 :(得分: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" />

如果您不想直接映射字段(因为您使用编译安全映射),您可以使用访问策略“field”映射公共属性,这是一个命名策略,如“camelcase-underscore”并明确指定“Int32”类型。

答案 1 :(得分: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();