多対多の関係を持つ2つのエンティティがあり、テーブルから結果を並べ替えることができる方法を探しています。
つまり、table1から行を取得し、table2から対応するすべてのレコードを取得するときに、table1のその行に固有のtable2のソート順を保存できるようにする必要があります。
私の最初の考えは、リレーションを表すテーブルに並べ替え列を追加することでしたが、私の知る限り、リレーションの新しい列にアクセスする方法はありません。
誰かがこれを達成する方法について何か提案がありますか?
多対多の関係を持つ2つのエンティティがあり、テーブルから結果を並べ替えることができる方法を探しています。
つまり、table1から行を取得し、table2から対応するすべてのレコードを取得するときに、table1のその行に固有のtable2のソート順を保存できるようにする必要があります。
私の最初の考えは、リレーションを表すテーブルに並べ替え列を追加することでしたが、私の知る限り、リレーションの新しい列にアクセスする方法はありません。
誰かがこれを達成する方法について何か提案がありますか?
Ladislav Mrnkaが述べているように、ジャンクションテーブルに新しい列を追加すると、ナビゲーションがはるかに困難になる「中央」に新しいエンティティが存在します。
これを避けたいが、それでも通常どおりナビゲーションを行うことができる場合は、ジャンクションテーブルを保持し、ジャンクションと同じように、順序列を追加して新しいテーブルを追加できます。注文情報が必要な場合は、このテーブルに参加して取得して使用できます。
もちろん、この新しいテーブルにはある程度のメンテナンスが必要です。つまり、junctionテーブルへのjunction+orderのカスケードで削除を作成できます。そして、トリガーを使用して(おっと、それは良くありません!)、新しく作成されたリレーションごとにデフォルトの順序で新しい行を作成します。したがって、これをビジネスロジックで処理することをお勧めします。
トリッキーすぎることは知っていますが、魔法の解決策はありません...あなたにとってより快適なものを選択するだけです。
table2の結果をtable1の行ごとに並べ替える必要があり、グローバルではないため、次の3つの非エレガントなソリューションがあります。
Ladislavが提案したアプローチ(見栄えの悪いモデルを使用)-注文列を追加し、ブリッジエンティティを追加します。
JotaBeが提案したアプローチ(見栄えの悪いスキーマを使用)-テーブルを追加し、両方を維持します。
コンテキストが読み取りのみに使用され(関係を変更する必要がない)、 DBから更新するたびにEDMXを手動で変更してもかまわない場合は、emdxをハックして、関係テーブルのSSDL定義をSQLクエリに変更できます。例えば
<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS">
<DefiningQuery>
SELECT ID1, ID2 ORDER BY ORDERVALUE
FROM AS_TO_BS
</DefiningQuery>
</EntitySet>
それ以外の:
<EntitySet Name="AS_TO_BS" EntityType="BlaBla.Store.AS_TO_BS"
store:Type="Tables" Schema="MY_SCHEMA" />
要件を緩和できるかどうかを確認し、そうでない場合は、3つのソリューションのいずれかに落ち着きます。
編集:
別のアイデア:
ジャンクションテーブルに新しい列を追加できますが、テーブルは新しいエンティティになるため、モデルは3つのエンティティで構成され、2つのエンティティと1つの多対多の関係ではなく2つの1対多の関係になります。
私の質問に対する良い答えをありがとうございました。私は今、さまざまなソリューションの長所と短所についてより自信を持っています。
結局のところ、リレーションテーブルに並べ替え列を追加するだけではモデルに影響はなく、DBからの更新は引き続き機能し、テーブルは多対多のリレーションとしてマップされます。次に、リレーションテーブルからソート列をフェッチするストアドプロシージャと、指定されたレコードのソートインデックスを更新する別のストアドプロシージャを作成しました。