我有两张桌子。
订单 - 使用列OrderID,OrderStatusID
OrderStatus - 使用列OrderStatusID,描述
我有一个Order对象,它调用数据库并填充其属性以便在我的代码中使用。现在我可以访问Order.OrderStatusID,但在我的应用程序中,我真的需要访问“描述”字段。
如何通过良好的OO设计优雅地处理这个问题?
答案 0 :(得分:2)
通常我更喜欢将查询处理为Value objects。我也使用Null Object pattern。
public class Order {
private int statusID;
public OrderStatus Status {
get {
return OrderStatus.Resolve(statusID);
}
set {
statusID = value != null ? value.ID : null;
}
}
}
public class OrderStatus {
public static OrderStatus Resolve(int statusID)
{
OrderStatus status = null;
// read from cache or DB
...
// if not found return Null object
if (status == null)
status = new OrderStatus(null, string.Empty);
return status;
}
}
答案 1 :(得分:1)
我正在使用的系统创建另一个业务对象的实例并设置Id。然后在使用时检索另一个业务对象。 e.g。
订单属性
int OrderId = 5
int OrderStatusId = 3
OrderStatus OrderStatus_ref
{
get
{
if OrderStatus_ref == null
OrderStatus_ref = new OrderStatus(OrderStatusId)
return OrderStatus_ref
}
}
无论如何,这是一般的想法。
答案 2 :(得分:0)
您可以将SQL select语句与JoinStatus表的Join一起使用,并在每个表中包含您想要的列...
Select O.OrderId, O.OrderStatusId, S.Descriptiuon
From Order O
Join OrderStatus S
On S.OrderStatusId = O.OrderStatusId
Where OrderId = 23 -- or whatever
答案 3 :(得分:0)
Order和OrderStatus之间是一对一的关系吗?我想这取决于你为什么会有一个OrderStatus表的目的,因为我认为实际上不需要单独的OrderStatus表?
基本上所有表格都能让您更改订单状态的描述。从代码中,您将根据预定义的OrderStatusID(来自种子数据?)或通过描述编写代码。如果是这种情况那么为什么不让Order表包含一个OrderStatus列,它是一个整数并且可以映射到枚举类型?
答案 4 :(得分:0)
My Order对象可能包含状态描述字段(readonly [to non internal classes]),以及任何其他类似字段。
在幕后,我的getter(例如LoadByID,LoadAll等)可能会使用包含所有这些描述性字段的View(例如OrdersView)。这些描述字段是只读的,因此您不会意外地设置那些认为可以将更改保存到数据库的字段。