2

次のようなDB構造があります。

create table Person (
  ID bigint identity not null,
  FirstName varchar(100),
  LastName varchar(100),
  -- etc... lot's of generic fields that apply to a person, e.g. phone, address
)

create table Teacher (
  ID bigint identity not null,
  PersonID bigint not null,
  EmploymentDate date,
  -- plus a bunch of other teacher-specific fields
)

create table Student (
  ID bigint identity not null,
  PersonID bigint not null,
  EnrollmentDate date,
  -- plus a bunch of student-specific fields
)

create table SystemUser (
  ID bigint identity not null,
  PersonID bigint not null,
  UserName varchar(50) not null,
  -- plus any user specific fields
)

と他のすべてのフィールドの関係Personは 1 -> 0:1 であり、 の各「サブクラス」はPersonに一意のキーを持っていますPersonID。Aは aまたは aSystemUserと同じ人物である場合があります。実際、3 つすべてを備えている人がいる可能性もあります。TeacherStudent

Teacherここで、 、Studentおよびを表す EF エンティティを作成したいと思います。SystemUserこれらはそれぞれ (1 位) から実際に継承するPersonか、少なくともPersonクラス内のフィールドを組み込み、両方の基になるテーブルに暗黙的にマッピングします。

同じ主キーを共有している例をオンラインでたくさん見つけましたが、同じ主キーを共有していない、つまりPersonID派生テーブルがテーブルにマップさIDれている例はありませんPerson

どうやってやるの?

4

1 に答える 1

1

実際、3 つすべてを備えている人がいる可能性もあります。

これが必要な場合は、person を他のクラスと一緒にマップしてはなりません。別Personのクラスと別PersonDetailのクラスPersonDetailを派生させることができ、StudentTPT継承でマップされたクラスが必要です。その要件をサポートするには、 との関係を 1 対多としてマップする必要があります。TeacherSystemUserPersonPersonDetail

継承を使用して人物をマップすると、モデルにはこのプロパティが含まれます

  • 1つPersonStudentTeacherまたはSystemUser
  • 実際に複数のロールとして機能する実在の人物がいる場合は、ロールごとにデータベースに複数の Person レコードが必要になります。それぞれに一意の主キーがあります。
  • 既存のPersonレコードの役割は変更できませんでした。つまり、Student常にそうでStudentあり、たとえばTeacher最初に を削除してPerson/Student新しい を作成しないと変更できませんでしPerson/Teacherた。
于 2012-10-21T16:00:04.947 に答える