2012-01-10 65 views
2

之间的多重关系,我有PersonCourse实体多重关系:配置实体

public class Course 
{ 
    public int CourseID { get; set; } 
    public virtual Person Leader { get; set; } 
    public virtual ICollection<Person> Teachers { get; set; } 
    public virtual Person CreatedBy { get; set; } 
    public virtual Person UpdatedBy { get; set; } 
    ... 
} 

public class Person 
{ 
    public int PersonID { get; set; } 
    public virtual ICollection<Course> CoursesCreated { get; set; } 
    public virtual ICollection<Course> CoursesUpdated { get; set; } 
    public virtual ICollection<Course> CoursesLead { get; set; } 
    public virtual ICollection<Course> CoursesTutored { get; set; } 
    ... 
} 

我有以下映射:

modelBuilder.Entity<Course>().HasMany(x => x.Tutors) 
          .WithMany(p => p.CoursesTutored) 
          .Map(x => 
           { 
            x.MapLeftKey("PersonID"); 
            x.MapRightKey("CourseID"); 
            x.ToTable("Course_Tutors"); 
           }); 

这工作,因为它建立了Course_Tutors表以及如提供Leader_PersonIDCreatedBy_PersonIDUpdatedBy_PersonID的课程表。

但是,它还在课程表中创建了三个额外的Person列:Person_PersonID1Person_PersonID2,Person_PersonID3

有人能告诉我如何摆脱这些?我假设我的映射需要更多的工作。

回答

4

当您在两个实体之间存在多个关系时,Code First存在通过转换来识别关系的问题。你需要明确地配置它们。

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.Leader) 
    .WithMany(p => p.CoursesLead) 
    .Map(m => m.MapKey("Leader_PersonID")); 

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.CreatedBy) 
    .WithMany(p => p.CoursesCreated) 
    .Map(m => m.MapKey("CreatedBy_PersonID")); 

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.UpdatedBy) 
    .WithMany(p => p.CoursesUpdated) 
    .Map(m => m.MapKey("UpdatedBy_PersonID")); 
+0

我认为这会做的工作,但它给我以下错误:类型Course_UpdatedBy没有命名空间StudentProject.EFRepository(别名=自我)定义 – James 2012-01-10 09:54:10

+1

@詹姆斯您是否正确包括所有这些映射?您是否使用先前创建的数据库结构和新的映射?有没有其他的属性,你还没有映射? – Eranga 2012-01-10 10:39:45

+0

我现在得到一个“不允许的循环引用。[Constraint name = Course_Tutors_Target]”。如此接近解决这个问题! – James 2012-01-10 11:09:19