【问题标题】:Should an Orderline reference a Product or simply have a Product Name property?Orderline 应该引用产品还是仅具有产品名称属性?
【发布时间】:2013-03-29 19:10:06
【问题描述】:

在为 Order 建模时,在 Orderline 中有 Product 的属性是否有帮助,还是只需要 Product Name?

教团:

public class Order 
{
    public Guid Id {get; set;}
    public DateTime OrderDate {get; set;}
    public Decimal Total {get;set;}
}

订单线:

public class Orderline
{
    public Guid Id {get; set;}
    public Order Order {get; set;}
    public Product Product {get; set;}
    public int Quantity {get; set;}
    public Decimal Price {get; set;}
}

如果我删除一个产品,它要么需要级联删除订单行和订单(这真的很糟糕),要么我 soft delete 并在产品上设置一个 IsDeleted 标志。

当然,在域模型中存在关系会很有帮助;因此,我可以从订单中访问它的 Orderlines,然后进入每行的产品并访问产品的所有属性。但是,由于 Orderline 具有价格属性,因此这种对产品的依赖似乎弊大于利。如果我更改 Orderline 使其只有产品名称(在下面的类中,我已将类型从 Product 更改为 String,那么我可以删除产品而不影响它的任何记录:

public class Orderline
{
    public Guid Id {get; set;}
    public Order Order {get; set;}
    public string Product {get; set;}
    public int Quantity {get; set;}
    public Decimal Price {get; set;}
}

【问题讨论】:

    标签: database-design domain-model


    【解决方案1】:

    我建议您只需将产品信息复制到订单行。产品有随时间变化的趋势,而您真正想要的是客户在特定时间购买的产品的快照。

    【讨论】:

      【解决方案2】:

      这真的取决于你的情况。如果您需要删除订单行,如果订单被删除,那么通过引用是正确的。我会通过参考来做。它简单快捷,而不是通过额外的步骤通过 ordername 获取订单。我什至不知道 orderline 与 order 有何不同。我认为应该只有一个命令,浓缩。如果东西是用sql保存的,做一个外键标识,如果都是c#做的,引用就好了。

      【讨论】:

      • 一个订单可能有很多商品,所以 Orderline 是一种管理方式。
      【解决方案3】:

      如果没有记错的话,Dynamics GP 等成熟的销售系统可以两者兼得。您需要知道订购时产品的状态;但能够将订单项链接到原始产品也很有用。例如,对于任何给定的产品,您有时可能需要编制一份购买该产品的客户列表。或者,如果产品名称发生变化,您可能需要能够确定该产品“是什么”,以便实现。

      也就是说,产品“是什么”不应该改变。并且已经订购的产品通常不应该被删除。但是,您最好也知道客户发票上的确切措辞、描述、定价等。

      在代码中,这是一个偏好问题,只要您在底层实现最佳实践即可。我建议在每个 OrderLine 上有两个完整的 Product 对象:

      public class Orderline
      {
          public Guid Id {get; set;}
          public Order Order {get; set;}
          public Product Product {get; set;}
          public Product OriginalProduct {get; set;}  // or "OriginatingProduct" or whatever
          public int Quantity {get; set;}
          public Decimal Price {get; set;}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-09
        • 2020-11-02
        • 2020-06-03
        相关资源
        最近更新 更多