我有两张桌子。
订单 - 包含列 OrderID、OrderStatusID
OrderStatus - 包含列 OrderStatusID、说明
我有一个 Order 对象,它调用数据库并填充其属性以在我的代码中使用。现在我可以访问 Order.OrderStatusID,但在我的应用程序中,我确实需要访问“描述”字段。
您如何通过良好的 OO 设计优雅地处理这个问题?
我有两张桌子。
订单 - 包含列 OrderID、OrderStatusID
OrderStatus - 包含列 OrderStatusID、说明
我有一个 Order 对象,它调用数据库并填充其属性以在我的代码中使用。现在我可以访问 Order.OrderStatusID,但在我的应用程序中,我确实需要访问“描述”字段。
您如何通过良好的 OO 设计优雅地处理这个问题?
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;
}
}
我目前正在使用的系统创建另一个业务对象的实例并设置 Id。然后在使用另一个业务对象时检索它。例如
订单属性
int OrderId = 5
int OrderStatusId = 3
OrderStatus OrderStatus_ref
{
get
{
if OrderStatus_ref == null
OrderStatus_ref = new OrderStatus(OrderStatusId)
return OrderStatus_ref
}
}
无论如何,这是一般的想法。
您可以将 SQL 选择语句与 OrderStatus 表的连接一起使用,并包含每个表中您想要的列...
Select O.OrderId, O.OrderStatusId, S.Descriptiuon
From Order O
Join OrderStatus S
On S.OrderStatusId = O.OrderStatusId
Where OrderId = 23 -- or whatever
Order 和 OrderStatus 之间是一对一的关系吗?我想这取决于你为什么会有一个 OrderStatus 表的目的,因为我认为实际上不需要单独的 OrderStatus 表?
基本上,该表为您提供的只是更改订单状态描述的能力。然后,您将在代码中根据预定义的 OrderStatusID(来自种子数据?)或通过描述编写代码。如果是这种情况,那么为什么不让 Order 表包含一个 OrderStatus 列,它是一个整数并且可以映射到一个枚举类型?
我的 Order 对象可能包括状态描述字段(只读 [对非内部类]),以及任何其他类似字段。
在后台,我的 getter(例如 LoadByID、LoadAll 等)可能会使用包含所有这些描述性字段的视图(例如 OrdersView)。这些描述字段是只读的,因此您不会意外设置这些字段,以为您可以将更改保存到数据库。