課程有許多先決條件,同時一門課程可以成爲許多課程的先決條件。我一直在使用EF試圖建立的許多一對多關係(OnModelBCreating)代碼先用以下:如何僅與一個實體創建多對多關係?
modelBuilder.Entity<Course>()
.HasMany(e => e.Prerequisites)
.WithMany(e => e.Postrequisites)
.Map(m => m.ToTable("CourseRequisiteMappings")
.MapLeftKey("CourseId").MapRightKey("CourseId")); // EDIT: THIS LINE IS THE PROBLEM. SEE MARKED ANSWER AND MY COMMENT ON IT.
而且,這裏是課程類:
public class Course
{
public int CourseId { get; set; }
public string Name { get; set; }
public string InstitutionCode { get; set; }
public string Description { get; set; }
public bool IsElective { get; set; }
public virtual ICollection<Instructor> Instructors { get; set; }
public virtual ICollection<Student> Students { get; set; }
public virtual ICollection<Module> Modules { get; set; }
public virtual ICollection<Course> Prerequisites { get; set; }
public virtual ICollection<Course> Postrequisites { get; set; }
}
當我實現了這一點,並去更新數據庫,它給了我以下錯誤:
CourseId:Name:一個類型中的每個屬性名稱必須是唯一的。屬性 名稱'CourseId'已經定義。
ModuleId:Name:類型中的每個屬性名稱必須是唯一的。屬性 名稱'ModuleId'已被定義。
CourseCourse:EntityType:EntitySet'CourseCourse'基於 'CourseCourse',沒有定義鍵。
ModuleModule:EntityType:EntitySet'ModuleModule'基於 'ModuleModule',它沒有定義鍵。
我找不到這樣導致我的一個例子,相信以下三個中的一個爲真:
- 有完成此不同的方式,我不看
- 我是在正確的軌道,但忽視的東西上,由於我缺乏知識與EF
- 我是第一個嘗試和EF不支持此(不太可能)
首先,有人知道我可以如何建立這種關係,即這些錯誤意味着什麼(迴應#2)?對於獎勵積分,是否有另外一種方法可能會更好或更差(有點兒#1)?提前致謝。
對!我正要問有關可讀性的問題,並且你有它。所以字面上我做的唯一不正確的事情是爲兩個映射的鍵使用名稱「CourseId」。其中存在的問題是:我認爲「MapLeft/RighKey」方法需要舊錶格上鍵列的名稱,而不是新的中間表格。最後,你不喜歡我最近創造的術語「postrequisite」嗎? = P – 2014-08-28 22:02:54
我總是在糾正別人的命名,不斷思考我可以做得更好;-)「先決條件」的確是必需的。後續課程通常是可選的... – Dabblernl 2014-08-28 22:05:50
只需要「Requisite」? – 2014-08-28 22:08:38