相互に関連する3つのエンティティがあります。
- Fooにはたくさんの添付ファイルがあります
- バーには多くのアタッチメントがあります
- 各添付ファイルは、FooまたはBarのいずれかに属することができます。
これを使用してモデル化する最良の方法は何DbModelBuilder
ですか?
試してみると:
modelBuilder.Entity<Foo>().HasMany(t => t.Attachments).WithOptional()
.Map(m => m.MapKey("FOO_ID")).WillCascadeOnDelete(true);
modelBuilder.Entity<Bar>().HasMany(t => t.Attachments).WithOptional()
.Map(m => m.MapKey("BAR_ID")).WillCascadeOnDelete(true);
これはあまりクリーンなデータモデルではありません。*添付ファイルテーブルには、可能な親エンティティ('FOO_ID'、'BAR_ID')ごとに1つずつ、2つのFK列があります。添付ファイルを必要とするエンティティの数を増やすと、テーブルが肥大化します。*もちろん、アタッチメントは常にエンティティにアタッチされますが、後方参照をオプションにする必要があります。必ずしもFooである必要はなく、Barである必要もありません。ただし、すべてのFKがNULLに設定されている添付ファイルは、ビジネスビューからは有効ではありませんが、スキーマによって許可されます。*理論的には、1つのアタッチメントがFooとBarの両方にリンクされている可能性がありますが、これは無効です。
代わりに、関係をジャンクションテーブル「T_FOO_ATTACHMENT」および「T_BAR_ATTACHMENT」にマップする場合があります。* T_FOO_ATTACHMENTには、Fooへの必須外部キー(FOO_ID)と添付ファイルへの必須FK(ATTACHMENT_ID)があります。*同じことがT_BAR_ATTACHMENTにも当てはまります
欠点:*アタッチメントは引き続きFooとBarにリンクできます。*添付ファイルが複数のFooにリンクされている可能性もありますが、これも無効です。理想的には、流暢な構文を使用して、それを防ぐDB制約を追加できます。