2008-11-18 78 views
0

我有两个表。如何将非规范化的值带入业务对象?

订单 - 使用列的OrderID,OrderStatusID
OrderStatus - 使用列OrderStatusID,说明

我有一个订单对象这就要求数据库并填充其属性在我的代码中使用。现在我可以访问Order.OrderStatusID,但在我的应用程序中,我确实需要访问“Description”字段。

如何用优秀的面向对象设计优雅地处理这件事?

回答

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; 
    } 
} 
0

您可以使用SQL SELECT语句用加入到OrderStatus表,包括列哟每个表要...

Select O.OrderId, O.OrderStatusId, S.Descriptiuon 
From Order O 
    Join OrderStatus S 
     On S.OrderStatusId = O.OrderStatusId 
Where OrderId = 23 -- or whatever 
+0

我知道如何从数据库中获取数据集,但我想知道如何映射到我的对象。当我填充Order对象时,能够作为描述访问Order Status并不是外部整数值。 – 2008-11-18 14:21:42

0

难道秩序之间的一个一对一的关系订单状态?我猜这取决于你为什么要有一个OrderStatus表的目的,因为我认为实际上并不需要单独的OrderStatus表?

基本上所有表格给你的是能够改变订单状态的描述。从代码中,您将根据预定义的OrderStatusID(来自种子数据?)或通过描述来编写代码。如果是这种情况,为什么不让Order表包含一个OrderStatus列,该列是一个整数,并且可以映射到一个枚举类型?

1

我正在使用的系统创建其他业务对象的实例并设置Id。其他业务对象在使用时将被检索。例如

订单属性

int OrderId = 5 
int OrderStatusId = 3 
OrderStatus OrderStatus_ref 
{ 
get 
{ 
    if OrderStatus_ref == null 
     OrderStatus_ref = new OrderStatus(OrderStatusId) 
    return OrderStatus_ref 
} 
} 

这反正是一般的想法。

0

我的订单对象可能会包含状态描述字段(只读[非内部类])以及任何其他类似的字段。

我的getter(例如LoadByID,LoadAll等)可能会使用包含所有这些描述性字段的View(例如OrdersView)。这些描述字段是只读的,以便您不会意外设置这些字段,认为您可以将更改保存到数据库中。