0

我有一个这样的模型:

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 表,不,我无法控制数据库结构。

很抱歉,如果有答案,但是搜索“映射”和“翻译”之类的东西并不能真正让我得到我正在寻找的结果,显然。

4

2 回答 2

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();
于 2013-06-26T11:04:49.993 回答
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 “ 类型。

于 2013-06-25T12:09:20.143 回答