web-dev-qa-db-ja.com

最初にEFコードでの部品表データベースの設計?

EFコードファーストで部品表の適切なデータベース設計を生成するのに問題があります。一般的な構造が必要なだけで、フィールドを追加します。

だから私は他の製品のアセンブリである他の製品から組み立てられた製品を持っている必要があります。

例:

製品1:

  • アルミボックス1x

    • アルミシート4倍

    • フォイル1x

    • ネジ6x

製品2:

  • ホイールカート1x

    • アルミボックス1x

    • ホイール4x

    • ネジ4x

    • フォイル2x

したがって、製品2(ホイールカート)は製品1(アルミニウムボックス)といくつかの追加コンポーネントから組み立てられていますが、両方で同じ製品ネジとフォイルが使用されていることに注意してください。

だから私はその階層を多対多だと思います。あるいは、誰かがより良い解決策を知っているかもしれません。

EFコードである必要はありません-最初に、T-SQLからコードを再生成できます。

ありがとうございました。

編集:

私はいじり回していて、何も機能していないようです、私は現在これを持っています:

コンポーネント

ComponentID

名前

価格

製品番号

N

|

|

|

1

製品

製品番号

ParentID

ComponentLookupId

最初にコンポーネントを作成し、次に階層化してコンポーネントをそれに関連付けることができる製品を作成します。次に、ルックアップを介してコンポーネントの名前と価格を取得しています。これは問題ありませんが、要約に問題があります。

名前、価格をコピーすると、コンポーネントが変更されたときに製品は変更されません。

または、結合テーブルに追加のフィールドを使用して多対多を試す必要があります。

4
Seeker

この概念は「スーパーBOM」と呼ばれ、他のBOMで構成されるBOMです。材料テーブル、BOMテーブル、BOMMaterialsテーブル、およびSuperBOMテーブルが必要です。 SuperBOMテーブルは、BOM間の関係を表します。

おおよそ次のように:

Material
-------------------------------
ID     Description

BOM
-------------------------------
ID     Description


BOMMaterials
-------------------------------
BOMID     MaterialID

SuperBOM
-------------------------------
ParentBOMID     ChildBOMID
2
Maess

ツリースタイルのデータを保存できます。

public class Item {
    [Id, DatabaseGenerated]
    public int Id {get;set;}
    [ForeignKey("Parent")]
    public int? ParentId {get;set;}

    //navigation to parent item
    virtual public Item Parent {get;set;}
    //navigation to children
    virtual public IEnumerable<Item> Children {get;set;}
}

ここで、ParentIdは、適切な外部キー制約を持つデータベース内のnull許容列です。 ParentIdがnullの場合、このアイテムは階層の最上位にあります。ナビゲーションプロパティを介して階層をトラバースできますが、遅延読み込みを有効にすると、小さなクエリが多数生成されるため、適切でない場合があります。

これは、BOMシステムに関する他の問題のいくつかには対処していません。たとえば、すべてではないが1つの場所でサブアセンブリとして使用されるアイテムがある場合、これは完全な解決策ではありませんが、いくつかの質問に対処する可能性があります。

1
Mikeb