1

注文をモデル化する場合、注文行に製品のプロパティがあると役立ちますか、それとも製品名だけが必要ですか?

オーダー:

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

確かに、ドメイン モデルに存在する関係を持つことは役に立ちます。したがって、注文から注文ラインにアクセスし、各行の製品にアクセスして、製品のすべてのプロパティにアクセスできます。しかし、オーダーラインには価格と数量のプロパティがあるため、この製品への依存は、役立つどころか害を及ぼすようです。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;}
}
4

3 に答える 3

2

製品情報を注文ラインに単純にコピーすることをお勧めします。製品は時間の経過とともに変化する傾向があり、本当に必要なのは、顧客が特定の時間に購入したもののスナップショットです。

于 2013-03-29T19:20:35.690 に答える
0

それは本当にあなたの状況に依存します。注文が削除された場合に注文行を削除する必要がある場合は、参照により正しいです。参考にさせていただきます。余分なステップである ordername を介して注文を取得する代わりに、シンプルで高速です。オーダーラインが注文とどう違うのかさえわかりません。注文は1つだけ、凝縮する必要があると思います。物事がSQLで保存されている場合は、外部キーの識別を行い、すべてがC#で行われている場合は、参照は問題ありません。

于 2013-03-29T19:15:15.103 に答える
0

記憶が正しければ、Dynamics GP のような確立された販売システムは両方を行います。注文時の製品の状態を知る必要があります。ラインアイテムを元の製品にリンクできるのも便利です。たとえば、特定の製品について、その製品を購入した顧客のリストを作成する必要がある場合があります。または、製品の名前が変更された場合、フルフィルメントの目的で、その製品が「何であるか」を判断できる必要がある場合があります。

とはいえ、製品の「あるべき姿」は変わらないはずです。また、注文された製品は、通常、決して削除されるべきではありません。ただし、理想的には、顧客の請求書に記載されている正確な言い回し、説明、価格なども知っている必要があります。

コードでは、内部でベスト プラクティスを実行している限り、好みの問題です。各 OrderLine に 2 つの完全な 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;}
}
于 2013-03-29T19:32:04.777 に答える