2011-09-02 10 views
15

EF Code First注文のためのジョインテーブルの追加列

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

アプリケーションで新しい列を使用しますか?そのような場合、あなたはあなたのモデルでそれをすることはできません。ジャンクション・テーブルにメイン・テーブルへの外部キー以外のものが含まれていない場合にのみ、多対多リレーションシップが機能します。アプリケーションにさらされた追加の列を追加すると、接合テーブルは他の必要な3番目のクラスとしてエンティティになります。あなたのモデルは、次のようになります。

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

1年後に同じ問題が発生し、これを検索する際にGoogleのトップヒットの1つになりました。余分な列を追加すると、多くの関係が緩んでいるという現在の実装がまだ残っているのだろうかと思います。 (この場合student.images?) –

+0

@ s093294:はい状況は同じで、変更されません。ジャンクション・テーブルに新しい列を追加する場合は、新しい列にアクセスするために多対多リレーションを直接指示するのではなく、新しいエンティティが必要です。 –

関連する問題