4

データベースに次のスキーマがあります。

  • BillingReferences (ReferencingType tinyint , ReferencingId tinyint , ReferencedType tinyint , ReferencedId tinyint , IsActive bit ) - すべてのフィールド (IsActive を除く) は一意のインデックスの一部です。
  • BillingType (BillingTypeId tinyint , Name varchar(50) )

ReferencedType および ReferencedType は、BillingTypes の外部キーです。BillingTypes には次の行が含まれます。

BillingTypeId | 名前

1 | ラベル

2 | 国

3 | 支払いプロバイダー

4 | 支払いオプション

5 | 銀行

ReferecingId および ReferencedId は、次のいずれかのエンティティの Id を表します (参照/参照タイプによって異なります)。

  • 銀行(BankId tinyint , Name varchar(50) )
  • (CountryId tinyint , Name varchar(50) )
  • ラベル(LabelId tinyint、名前varchar(50) )
  • PaymentProviders (PaymentProviderId tinyint、名前varchar(50) )
  • PaymentOptions (PaymentOptionId tinyint、名前varchar(50) )

将来、各エンティティにはさらにいくつかの異なる列が追加される予定ですが、今のところは単純化のためのスキーマです。

すべてのエンティティ (国を除く) と国の間に (1- ) の接続があります。ラベルには、 Banks、PaymentProviders、および PaymentOptions への (1-) の接続があります。また、PaymentProviders には PaymentProviders への (1-*) の接続があります。

たとえば、BankId 201 の銀行を CountryId 3003 の国に接続する場合、BillingReferences に次のようなレコードが作成されます。

拡張性を考慮して、接続の種類ごとに接続/参照テーブルを作成しませんでした。別のエンティティを追加する場合は、そのテーブルを追加し、BillingReferences と BillingType にレコードを追加するだけです。

問題は、BillingReferences と各エンティティの間で条件付き外部キーを構成できず、EntityFramework で構成/マップできないように見えることです...

このタイプの実装を使用するチュートリアルや例は見つかりませんでした。接続ごとに参照テーブルを作成する必要がありますか、または EntityFramework でこれを構成する方法はありますか?

助けてくれてありがとう :)

4

5 に答える 5

1

私の知る限り、これを行う方法はありません。

本当にそうしない正当な理由がない限り、タイプごとに個別のテーブルを作成します。あなたが言及する考慮事項は良いものではありません、IMHO。

テーブルを増やすと、キーに外部キー制約を設定できるようになり、EF にうまく変換されます。また、パフォーマンスにも役立ちます。100 万行の大きな参照テーブルは、より小さなテーブルよりもクエリに時間がかかります (型のすべての参照が常に必要な場合を除きます)。

于 2009-03-03T10:10:18.187 に答える
1

これを Entity Framework で行う方法がないだけでなく、SQL でも行う方法がありません。5 つの異なるテーブルのいずれかを参照する外部キーを持つことはできません。

代わりにすべきことは、親の抽象参照型を持ち、この親型の具体的な型のサブタイプを作成することです。これで、1 つのテーブルに対する外部キーが 1 つだけになりました。タイプごとのテーブルまたは階層マッピングごとのテーブルを選択できます。あなたが言及したタイプのいずれにも特別な列がまったくないことを考えると、階層マッピングごとのテーブルがより良い選択になると思います.

于 2009-03-03T12:59:08.627 に答える
1

目的を達成できる唯一の方法は、サーバー側で処理を処理するトリガーを構築することです。そのような FK を複数のテーブルにマップすることはできません。しかし、トリガーはそのロジックを処理できます。もちろん、それは完全にEFの外になります...

また、タイプごとに個別のテーブルを作成することをお勧めします。長期的には維持しやすいと思います。

于 2009-07-31T22:13:32.203 に答える
0

さて、私は Inferis の提案を使用して、タイプごとに個別のテーブルを作成するつもりだと思います。

回答ありがとうございます - 彼らは大いに役立ちまし:)

于 2009-03-03T14:45:21.927 に答える