0

Entity Framework で複数の親を持つ子を実装するにはどうすればよいですか?
結果のテーブルは次のようになります。

1.コース:

CourseID int identity
CourseTitle nvarchar
.
.
.

OtherColumns as neede

2.コースの前提条件:

CourseID (FK to Course.CourseID)
PreRequisiteCourseID (FK to Course.CourseID)

または、子レコードの複数の親を実現するより良い方法はありますか?

4

1 に答える 1

3

同じ親クラスを参照する子クラスの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);
于 2012-08-28T19:58:44.460 に答える