0

如何在实体框架中实现具有多个父级的子级?
结果表必须如下:

1.课程:

CourseID int identity
CourseTitle nvarchar
.
.
.

OtherColumns as neede

2.课程先决条件:

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

或者有没有更好的方法来实现一个子记录的多个父级?

4

1 回答 1

3

您只需要在子类中引用同一个父类的两个导航属性和 - 可选 - 两个对应的外键属性:

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
}

如果两个关系中的一个或两个是可选的,则使用int?代替int外键属性。

如果您使用上面示例中指示的属性名称,则无需配置任何内容。EF 将通过命名约定识别这两个一对多关系。

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; }

或者使用 Fluent API:

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 回答