2012-01-10 56 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