2012-08-28 57 views
0

如何实现一个在实体框架中有多个父母的孩子?
生成的表必须如下:实体框架一个孩子的多父母

1.Courses:

CourseID int identity 
CourseTitle nvarchar 
. 
. 
. 

OtherColumns as neede 

2.CoursePreRequisites:

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

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

回答

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

或用流利的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); 
相关问题