2011-09-02 15 views
15

Tengo dos entidades que tienen una relación por la que se crea una tabla de uniónCódigo EF La primera columna adicional en la tabla de unión para los propósitos que ordenan

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

Me gustaría añadir una columna adicional para permitir la ordenación cronológica de la StudentImages.

¿Dónde debería agregar insertar el código correspondiente?

Respuesta

24

¿Desea utilizar esa nueva columna en su aplicación? En tal caso, no puede hacer eso con su modelo. La relación de muchos a muchos funciona solo si la tabla de unión no contiene nada más que claves externas a las tablas principales. Una vez que agrega una columna adicional expuesta a su aplicación, la tabla de unión se convierte en entidad como cualquier otra = necesita tercera clase. Su modelo debe verse como:

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

y su asignación debe cambiar también:

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, esto significa que va a perder el acceso a Student.Images etc. Me pregunto puedo mantener lo que tengo por el momento y crear una entidad separada StudentImagesOrder y dejar que el código primero cree esto y almacene esta información allí? –

+0

Teniendo el mismo problema un año después y siendo este uno de los principales éxitos en google al buscarlo, me pregunto si sigue siendo la implementación actual que al agregar la columna adicional pierdo la relación de muchos a muchos. (en este caso student.images?) –

+0

@ s093294: Sí, la situación es la misma y no cambiará. Si agrega una nueva columna a la tabla de unión, necesita una nueva entidad en lugar de una relación directa de muchos a muchos para tener acceso a la nueva columna. –

Cuestiones relacionadas