Entity-framework-relationships
Entity Framework-関係
リレーショナルデータベースでは、関係は外部キーを介してリレーショナルデータベーステーブル間に存在する状況です。 外部キー(FK)は、2つのテーブルのデータ間のリンクを確立および実施するために使用される列または列の組み合わせです。 次の図には、3つのテーブルが含まれています。
- 学生
- コース
- 入会
上の図では、テーブル間のある種の関連付け/関係を見ることができます。 テーブル間の関係には3つのタイプがあり、異なるテーブル間の関係は、関連する列の定義方法によって異なります。
- 1対多の関係
- 多対多の関係
- 一対一の関係
1対多の関係
- 1対多の関係は、最も一般的なタイプの関係です。
- このタイプの関係では、テーブルAの行はテーブルBの多くの一致する行を持つことができますが、テーブルBの行はテーブルAの一致する行を1つだけ持つことができます。
- 外部キーは、関係の多端を表すテーブルで定義されます。
- たとえば、上の図では、StudentテーブルとEnrollmentテーブルには1対1の関係があり、各学生には多くの登録がありますが、各登録は1人の学生にのみ属します。
エンティティフレームワークでは、これらの関係もコードで作成できます。 以下は、1対多の関係に関連付けられているStudentクラスとEnrollmentクラスの例です。
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
public class Enrollment {
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public Grade? Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
上記のコードでは、StudentクラスにはEnrollmentのコレクションが含まれていますが、Enrollmentクラスには単一のStudentオブジェクトがあります。
多対多の関係
多対多の関係では、テーブルAの行はテーブルBの多くの一致する行を持つことができ、逆もまた同様です。
- そのような関係を作成するには、ジャンクションテーブルと呼ばれる3番目のテーブルを定義します。このテーブルの主キーは、テーブルAとテーブルBの両方からの外部キーで構成されます。
- たとえば、StudentテーブルとCourseテーブルには、これらの各テーブルからEnrollmentテーブルへの1対多の関係によって定義される多対多の関係があります。
次のコードには、Courseクラスと上記の2つのクラス、つまり Student と Enrollment が含まれています。
public class Course {
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
コースクラスと学生クラスの両方に、ジャンクションクラス登録を介して多対多の関係を作成する登録オブジェクトのコレクションがあることがわかります。
一対一の関係
- 1対1の関係では、テーブルAの行はテーブルBの一致する行を1つしか持つことができません。逆も同様です。
- 関連する列の両方が主キーであるか、一意の制約がある場合、1対1の関係が作成されます。
- 1対1の関係では、主キーはさらに外部キーとして機能し、どちらのテーブルにも個別の外部キー列はありません。
この方法で関連するほとんどの情報はすべて1つのテーブルにあるため、このタイプの関係は一般的ではありません。 あなたは1対1の関係を使用するかもしれません-
- 多くの列を持つテーブルを分割します。
- セキュリティ上の理由から、テーブルの一部を分離します。
- 寿命が短く、テーブルを削除するだけで簡単に削除できるデータを保存します。
- メインテーブルのサブセットにのみ適用される情報を保存します。
以下のコードは、学生のメールIDとパスワードを含む別のクラス名StudentProfileを追加します。
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public virtual StudentProfile StudentProfile { get; set; }
}
public class StudentProfile {
public StudentProfile() {}
public int ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public virtual Student Student { get; set; }
}
StudentエンティティクラスにはStudentProfileナビゲーションプロパティが含まれ、StudentProfileにはStudentナビゲーションプロパティが含まれていることがわかります。
各学生は、大学のドメインにログインするための1つのメールとパスワードのみを持っています。 これらの情報はStudentテーブルに追加できますが、セキュリティ上の理由から別のテーブルに分離されます。