0

私は3つのテーブルを持っています

Brands:
BrandID int
BrandName varchar(30)

Products
ProdID int
ProdName varchar(30)

BrandToProd:
BrandID int => FK Brands.BrandID
ProdID int => FK Products.ProdID

既存のデータベースからモデルを生成した後、EF は BrandToProd テーブルを省略し、ブランドと製品の間に多対多の関係を作成します。次のフィールドを持つ 3 番目のエンティティが必要です。

BrandName varchar(30)
ProductsName varchar(30)

これにより、このエンティティに足場を使用できるようになります。理想的には、ブランドと製品の新しいペアを追加するとき、EF はそのようなブランドまたは製品がデータベースに既に存在するかどうか (重複を避けるため) を最初に確認し、存在しない場合は対応するテーブルに追加し、BrandToProd テーブルへのマッピングを追加する必要があります。Brand または Product が既に存在する場合、EF は BrandToProd テーブルに追加するときに既存の BrandID/ProdID 値を使用する必要があります。それを行う方法はありますか?

4

3 に答える 3

2

あなたのBrandToProdテーブルは純粋なジャンクション テーブルです。つまり、外部キーが 2 つしかないテーブルです。このようなテーブルを、概念モデルのクラスなしで多対多の関連付けにモデル化するのは、EF の機能です。

モデルに純粋なジャンクション テーブルをエンティティ クラスとして含める最も簡単な方法は、次のとおりです。

  • データベース テーブルにダミー フィールドを一時的に追加する
  • モデルを生成する
  • データベースからフィールドを削除する
  • データベースからモデルを更新する
  • edmx ダイアグラムでプロパティを削除します

別の方法として、edmx を手動で編集することもできますが、その場合は自分が何をしているのかを本当に知る必要があります。モデルを再生成したくない場合は、2 番目のモデルを生成し、差分ビューアーで両方の edmx ファイルの違いを調査できます。

ただし、これを行う必要があるかどうかは疑問です。これを重複チェックに関連付けているようです。Brandしかし、データベースにorを追加したい場合は、Productいずれかの方法で重複をチェックする必要があります。新しい関連付けを追加する場合 (たとえば、既存のブランドを Product.Brands に追加する場合)、その関連付けが存在するかどうかを確認する必要はありません。その場合、EF は「新しい」関連付けを無視します。

于 2013-02-08T21:36:32.300 に答える
1

Gert の回答の追加点として、代理キーを使用する場合、重複管理の問題が常に発生します。通常、論理キーを作成する 1 つ以上のフィールドがあります。あなたはできる

  • a) データベースに一意のインデックスを作成します。制約に違反すると、データベースは文句を言います
  • b) 挿入を試みる前に、論理重複チェックを実行します。
于 2013-05-10T14:37:41.937 に答える