我有一个这样的模型:
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表,不,我无法控制数据库结构。
很抱歉,如果有这方面的答案,但搜索“映射”和“翻译”之类的内容并不能真正让我得到我正在寻找的结果。
答案 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();