9

EF4 の継承マッピングを理解しようとしています。

私のデータベースには、次の構造を持つ 2 つのテーブルがあります。

PersonCategory テーブル:

  • CategoryID (int) (ID) (PK)
  • カテゴリ タイプ (nvarchar(50))

人物表

  • PersonID (int) (ID) (PK)
  • CategoryID (PersonCategory テーブルの外部キー)
  • 名前 (nvarchar(50))
  • 説明 (nvarchar(max))

PersonCategory テーブルには、それぞれカテゴリを表す 4 つのエントリがあります - Student、CourseInstructor、Staff、および Advisor。

オンラインで記事を読んだ結果、 Table Per Hierarchyがこのシナリオに適したモデルになると思いました。そのため、EF4 では、それぞれ Person テーブルから継承する 4 つのエンティティ (Student、CourseInstructor、Staff、および Advisor) を作成しました。次に、それぞれを Person テーブルにマップし、それぞれに条件を追加して (たとえば、Student エンティティの場合は CategoryID = 1、Staff エンティティの場合は CategoryID = 2)、他と区別しました。また、Person テーブルから CategoryID プロパティを削除し、抽象クラスにしました。しかし、Person テーブルから CategoryId プロパティを削除したため、次のエラーが発生します。

エラー 3015: 行 101、108、114、120、126、133 で始まるフラグメントのマッピングの問題: テーブル Person (CategoryID) からテーブル PersonCategory (CategoryID) への外部キー制約 'FK_Person_PersonCategory':: マッピングが不十分です: 外部キーをマップする必要があります概念側で外部キー関連付けに参加している一部の AssociationSet または EntitySet に。

階層ごとのテーブルは、このシナリオに適したモデルですか? そうでない場合、EF4 でこのシナリオにどのようにアプローチすればよいですか?

4

3 に答える 3

5

関連付けで識別子列を使用することには問題があります。見る:-

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/24380ee6-4753-46a2-a3ed-b1cb2e2d161c

「重要な点は、null 以外の条件に参加しない限り、識別子として機能する列を関連付けにマップできないことです。」

于 2010-11-10T18:56:11.817 に答える
0

Table-per-Hierarchyの場合、1つのテーブルにすべてのタイプのすべての列が含まれます。テーブルが2つあるので、すぐに疑わしいです。

Table-per-Typeを選択する場合は、それも正しくありません。PersonCategoryテーブルが派生型のプロパティ値のデータを提供する場合、基本型と派生型の2つの型しか使用できません。ただし、これには外部キーとしてPersonIDが必要ですが、そうではありません。

個人的には、エンティティをさまざまなタイプに不必要に断片化していると思います。両方のテーブルのすべての列を1つのエンティティにマップするか、可能であれば、ニーズに合わせてデータベーススキーマを変更することができます。

空のテストデータベースで作業し、TPTおよびTPHモデルファーストの設計を行い、EFが目的のセットアップ用に構築するスキーマを確認することをお勧めします。

ルーク

于 2012-07-03T14:18:54.297 に答える
0

あなたが本当に欲しいのはタイプごとのテーブルだと思います http://www.robagby.com/entity-framework/entity-framework-modeling-table-per-type-in​​heritance/

于 2010-11-17T02:51:17.163 に答える