2012-08-28 87 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); 
相關問題