SaaS コンセプトのマルチテナンシー データベース スキーマ設計を検討しています。ASP.NET MVC -> EF になりますが、それはそれほど重要ではありません。
以下に、データベース スキーマの例を示します (テナントは会社です)。CompanyId はスキーマ全体で複製され、主キーは自然キーとテナント ID の両方に配置されています。
このスキーマを Entity Framework にプラグインすると、テーブルを Entity Model ファイル (Model1.edmx) に追加すると、次のエラーが発生します。
- リレーションシップ 'FK_Order_Customer' は、テーブル 'Order' の主キー '{OrderId, CompanyId}' のセットに部分的に含まれている外部キー '{CustomerId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- 関係 'FK_OrderLine_Customer' は、テーブル 'OrderLine' の主キー '{OrderLineId, CompanyId}' のセットに部分的に含まれている外部キー '{CustomerId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- 関係 'FK_OrderLine_Order' は、テーブル 'OrderLine' の主キー '{OrderLineId, CompanyId}' のセットに部分的に含まれている外部キー '{OrderId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- リレーションシップ 'FK_Order_Customer' は、テーブル 'Order' の主キー '{OrderId, CompanyId}' のセットに部分的に含まれている外部キー '{CustomerId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- 関係 'FK_OrderLine_Customer' は、テーブル 'OrderLine' の主キー '{OrderLineId, CompanyId}' のセットに部分的に含まれている外部キー '{CustomerId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- 関係 'FK_OrderLine_Order' は、テーブル 'OrderLine' の主キー '{OrderLineId, CompanyId}' のセットに部分的に含まれている外部キー '{OrderId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
- リレーションシップ 'FK_OrderLine_Product' は、テーブル 'OrderLine' の主キー '{OrderLineId, CompanyId}' のセットに部分的に含まれている外部キー '{ProductId, CompanyId}' のセットを使用します。外部キーのセットは、主キーのセットに完全に含まれているか、モデルにマップされる主キーのセットに完全に含まれていない必要があります。
質問は 2 つの部分に分かれています。
- 私のデータベース設計は間違っていますか? これらの複合主キーは控えるべきですか? 私は、基本的なスキーマ設計 (frazzled Brain Syndrome) に関する私の正気を疑っています。「理想化された」スキーマを提案してください。
- あるいは、データベースの設計が正しい場合、EF はこれらの外部キーを 1 対 1 の関係が誤って構成されている可能性があると認識しているため、キーを照合できませんか? どの場合、これは EF のバグですか?どうすれば回避できますか?