1

多対多の関係を持つ2つのエンティティがあり、テーブルから結果を並べ替えることができる方法を探しています。
つまり、table1から行を取得し、table2から対応するすべてのレコードを取得するときに、table1のその行に固有のtable2のソート順を保存できるようにする必要があります。

私の最初の考えは、リレーションを表すテーブルに並べ替え列を追加することでしたが、私の知る限り、リレーションの新しい列にアクセスする方法はありません。

誰かがこれを達成する方法について何か提案がありますか?

4

4 に答える 4

2

Ladislav Mrnkaが述べているように、ジャンクションテーブルに新しい列を追加すると、ナビゲーションがはるかに困難になる「中央」に新しいエンティティが存在します。

これを避けたいが、それでも通常どおりナビゲーションを行うことができる場合は、ジャンクションテーブルを保持し、ジャンクションと同じように、順序列を追加して新しいテーブルを追加できます。注文情報が必要な場合は、このテーブルに参加して取得して使用できます。

もちろん、この新しいテーブルにはある程度のメンテナンスが必要です。つまり、junctionテーブルへのjunction+orderのカスケードで削除を作成できます。そして、トリガーを使用して(おっと、それは良くありません!)、新しく作成されたリレーションごとにデフォルトの順序で新しい行を作成します。したがって、これをビジネスロジックで処理することをお勧めします。

トリッキーすぎることは知っていますが、魔法の解決策はありません...あなたにとってより快適なものを選択するだけです。

于 2012-06-05T10:09:41.967 に答える
1

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つのソリューションのいずれかに落ち着きます。

編集:

別のアイデア:

  • ビューを使用してリレーションシップテーブルを複製し、リレーションシップをビュー(読み取り専用)にマップし、注文エンティティをテーブル(書き込み可能)にマップします。
于 2012-06-05T16:15:01.890 に答える
1

ジャンクションテーブルに新しい列を追加できますが、テーブルは新しいエンティティになるため、モデルは3つのエンティティで構成され、2つのエンティティと1つの多対多の関係ではなく2つの1対多の関係になります。

于 2012-06-05T09:52:16.120 に答える
0

私の質問に対する良い答えをありがとうございました。私は今、さまざまなソリューションの長所と短所についてより自信を持っています。

結局のところ、リレーションテーブルに並べ替え列を追加するだけではモデルに影響はなく、DBからの更新は引き続き機能し、テーブルは多対多のリレーションとしてマップされます。次に、リレーションテーブルからソート列をフェッチするストアドプロシージャと、指定されたレコードのソートインデックスを更新する別のストアドプロシージャを作成しました。

于 2012-06-07T10:55:49.023 に答える