课程有许多先决条件,同时一门课程可以成为许多课程的先决条件。我一直在使用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