2011-09-02 40 views
15

Tôi có hai thực thể có một mối quan hệ mà tôi tạo ra một bảng tham giaEF Mã Đầu tiên cột bổ sung trong tham gia bảng cho mục đích đặt hàng

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")); 
} 

Tôi muốn thêm một cột bổ sung để cho phép đặt hàng tự thời gian của StudentImages.

Tôi nên thêm mã chèn có liên quan ở đâu?

Trả lời

24

Bạn có muốn sử dụng cột mới đó trong ứng dụng của mình không? Trong trường hợp này bạn không thể làm điều đó với mô hình của bạn. Mối quan hệ nhiều-nhiều chỉ hoạt động nếu bảng giao tiếp không chứa bất kỳ thứ gì khác ngoài các khóa ngoài cho các bảng chính. Khi bạn thêm cột bổ sung tiếp xúc với ứng dụng của mình, bảng giao nhau sẽ trở thành thực thể như bất kỳ mục nào khác = bạn cần lớp thứ ba. Mô hình của bạn sẽ giống như thế:

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; } 
} 

Và bản đồ của bạn phải thay đổi cũng như:

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

hmmm, điều này có nghĩa là tôi sẽ mất quyền truy cập Student.Images vv Tôi tự hỏi tôi có thể giữ những gì tôi có tại thời điểm này và tạo một thực thể StudentImagesOrder riêng biệt và để cho mã đầu tiên tạo ra và lưu trữ thông tin này ở đó? –

+0

Có cùng một vấn đề một năm sau đó và đây là một trong những hit hàng đầu trên google khi tìm kiếm nó - tôi tự hỏi, nếu nó vẫn thực hiện hiện tại khi thêm cột thêm tôi mất nhiều nhiều mối quan hệ. (trong trường hợp này là student.images?) –

+0

@ s093294: Có tình huống giống nhau và nó sẽ không thay đổi. Nếu bạn thêm một cột mới vào bảng giao tiếp, bạn cần một thực thể mới thay vì trực tiếp nhiều đến nhiều quan hệ để có quyền truy cập vào cột mới. –

Các vấn đề liên quan