2011-09-02 53 views
15

我有两个实体拥有,我创建一个连接表EF代码第一附加列连接表订购目的

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Image> Images { get; set; } 
} 


public class Image 
{ 
    public int Id { get; set; } 
    public string Filename { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

     modelBuilder.Entity<Student>() 
      .HasMany(i => i.Images) 
      .WithMany(s => s.Students) 
      .Map(m => m.ToTable("StudentImages")); 
} 

我想添加一个附加列允许的时间顺序排列的关系StudentImages。

我应该在哪里添加相关代码?

回答

24

是否要在应用程序中使用该新列?在这种情况下,你不能用你的模型做到这一点。多对多关系只有在联结表不包含除主表的外键以外的任何内容时才起作用。一旦添加了暴露给应用程序的附加列,联结表就会变成其他任何实体=你需要第三个类。你的模型应该是这样的:

public class StudentImage 
{ 
    public int StudentId { get; set; } 
    public int ImageId { get; set; } 
    public int Order { get; set; } 
    public virtual Student Student { get; set; } 
    public virtual Image Image { get; set; } 
} 

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<StudentImage> Images { get; set; } 
} 


public class Image 
{ 
    public int Id { get; set; } 
    public string Filename { get; set; } 
    public virtual ICollection<StudentImage> Students { get; set; } 
} 

你的映射也必须改变:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<StudentImages>().HasKey(si => new { si.StudentId, si.ImageId }); 

    // The rest should not be needed - it should be done by conventions 
    modelBuilder.Entity<Student>() 
       .HasMany(s => s.Images) 
       .WithRequired(si => si.Student) 
       .HasForeignKey(si => si.StudentId); 
    modelBuilder.Entity<Image>() 
       .HasMany(s => s.Students) 
       .WithRequired(si => si.Image) 
       .HasForeignKey(si => si.ImageId); 
} 
+0

嗯,这意味着我将失去进入Student.Images等我不知道我能保持我有什么目前并创建一个单独的StudentImagesOrder实体并让代码首先创建它并将此信息存储在那里? –

+0

一年后有同样的问题,这是谷歌搜索时的顶级命中之一 - 我想知道它是否仍然是目前的实施,当添加额外的列时,我放松了多对多的关系。 (在这种情况下,student.images?) –

+0

@ s093294:是的情况是相同的,它不会改变。如果将新列添加到联结表中,则需要一个新实体,而不是多对多直接访问新列。 –