0

最初に言ったのは、これがEntity Frameworkを使用した最初の経験なので、これが初心者の質問になってしまった場合はお詫びします。これまでのところすべてが順調に進んでいます。しかし、私はどのように対処するのが最善かわからないという状況に遭遇します。

多対多の関係を築く必要があります。ただし、多対多のテーブルには、複合キーだけではありません。この場合、Entity Frameworkはそれを多対多の構造として認識しないため、介在するテーブルを使用せずにコレクションを取得する簡単な機能を取得できないようです。これを行うためのより良い方法はありますか?

簡略化した例:

  • ユニットは多くのボードを持つことができ、ボードは多くのユニットにある可能性があります
  • それがユニットにあるとき、それがどのスロットにあったかを記録する必要があります。

テーブル:

Unit
 UnitID(PK)
 UnitName

Board
 BoardID(PK)
 BoardName

UnitBoard
 UnitID(PK,FK1)
 BoardID(PK,FK2)
 Slot

ADO.NETエンティティデータモデルを使用してこれをコードに取り込むと、ユニットに関連付けられているボードのコレクションをユニットエンティティから取得する簡単な方法がわかりません。その逆も同様です。

これを行うためのより良い方法はありますか、それとも関連するUnitBoardsのコレクションを使用して、それを使用してUnits / Boardsのコレクションを構築する必要がありますか?

これはおそらく私がこのようなことをした最初の人ではないようです。例:Books and Ownersが、関連するBookOwner情報(購入日など)も保持したいと考えていました。

4

2 に答える 2

1

これを行うためのより良い方法はありますか、それとも関連するUnitBoardsのコレクションを使用して、それを使用してUnits / Boardsのコレクションを構築する必要がありますか?

カスタムジャンクションテーブルを作成する唯一の方法は、作成したとおりにエンティティを作成することです。EFに多対多の関係を管理させて、直接ナビゲーションコレクションを作成するか、関係にカスタムプロパティを設定することができますが、両方を使用することはできません。

理由を考えると、EFでリレーションシップにカスタムプロパティを設定できる場合、どのようにアクセスしますか?からに到達するにBoardUnit、あなたはただ行くでしょうUnit.Boards。からに行くにはUnitBoardになりますBoard.Units。個々の関係にスロットプロパティを配置する場所は実際にはありません。

于 2012-10-24T00:22:00.380 に答える
1

更新されたEntityFramework5でも、この問題に対する適切な解決策はありません。適切な外部キー関係がある場合は、次のようなボードまたはユニットにアクセスできるはずです。

Unit.UnitBoards.Boards

また

Board.UnitBoards.Units

ただし、多対多のテーブルに複合キーの外部に独自のプロパティがある場合は、直接ナビゲーションプロパティ(多対多ナビゲーション)はありません。

フィルタリングする場合、およびを使用してそれらを含めることができ、IncludedbSelect呼び出しを減らすことができます。

var myBoards = From Context.Boards
  .Include(i => i.UnitBoards)
  .Include(i => i.UnitBoards.Select(is => is.Unit))
  .Where(...)
于 2012-10-24T00:25:28.147 に答える