如何在实体框架中实现具有多个父级的子级?
结果表必须如下:
1.课程:
CourseID int identity
CourseTitle nvarchar
.
.
.
OtherColumns as neede
2.课程先决条件:
CourseID (FK to Course.CourseID)
PreRequisiteCourseID (FK to Course.CourseID)
或者有没有更好的方法来实现一个子记录的多个父级?
如何在实体框架中实现具有多个父级的子级?
结果表必须如下:
1.课程:
CourseID int identity
CourseTitle nvarchar
.
.
.
OtherColumns as neede
2.课程先决条件:
CourseID (FK to Course.CourseID)
PreRequisiteCourseID (FK to Course.CourseID)
或者有没有更好的方法来实现一个子记录的多个父级?
您只需要在子类中引用同一个父类的两个导航属性和 - 可选 - 两个对应的外键属性:
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);