同じ親クラスを参照する子クラスの2つのナビゲーションプロパティと、オプションで2つの対応する外部キープロパティが必要です。
public class Course
{
public int CourseID { get; set; } // PK property
public string CourseTitle { get; set; }
}
public class CoursePreRequisite
{
public int CoursePreRequisiteID { get; set; } // PK property
public int CourseID { get; set; } // FK property 1
public Course Course { get; set; } // Navigation property 1
public int PreRequisiteCourseID { get; set; } // FK property 2
public Course PreRequisiteCourse { get; set; } // Navigation property 2
}
2つの関係の一方または両方がオプションの場合は、外部キープロパティのint?
代わりにを使用します。int
上記の例に示されているようにプロパティ名を使用する場合は、何も構成する必要はありません。EFは、命名規則によって2つの1対多の関係を認識します。
Course
コレクションが必要または必要な場合は、エンティティの逆プロパティとしてコレクションを使用することもできます。
public class Course
{
public int CourseID { get; set; } // PK property
public string CourseTitle { get; set; }
public ICollection<CoursePreRequisite> PreRequisites1 { get; set; }
public ICollection<CoursePreRequisite> PreRequisites2 { get; set; }
}
ただし、その場合は、リレーションシップで一緒に属するナビゲーションプロパティのペアを指定する必要があります。たとえば、データ注釈を使用してこれを行うことができます。
[InverseProperty("Course")]
public ICollection<CoursePreRequisite> PreRequisites1 { get; set; }
[InverseProperty("PreRequisiteCourse")]
public ICollection<CoursePreRequisite> PreRequisites2 { get; set; }
またはFluentAPIを使用する場合:
modelBuilder.Entity<Course>()
.HasMany(c => c.PreRequisites1)
.WithRequired(p => p.Course) // Or WithOptional
.HasForeignKey(p => p.CourseID);
modelBuilder.Entity<Course>()
.HasMany(c => c.PreRequisites2)
.WithRequired(p => p.PreRequisiteCourse) // Or WithOptional
.HasForeignKey(p => p.PreRequisiteCourseID);