entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

insertar en relacion muchos a muchos entityframework

Buenas comunidad.

Tengo un problema y es que tengo una relación de muchos a muchos
poniendo un ejemplo es el de alumnos y cursos.
Una alumno puede estar en varios cursos así como en un curso pueden haber muchos alumnos,
Se crea una tabla intermedia alumnosCursos bien por aquí, hice todos los pasos para agregar el entity framework correctamente
y las tablas quedan algo así (Las imágenes no son mías pero es algo parecido, solo que en vez de

public virtual List<Course> courses {get; set;}
public virtual List<Student> students {get; set;}

Es
public virtual ICollection<Course> courses {get; set;}
public virtual ICollection<Student> students {get; set;}
)
[img=http://k42.kn3.net/6/D/4/9/F/9/61F.png]
[img=http://k42.kn3.net/5/3/8/2/F/3/C8A.png]

Ahora cuando quiero agregar un estudiante a un curso o en un curso agregar un estudiante con el metodo add me lanza una excepcion.
por ejemplo: tengo un alumno y un curso

Student alumno = new Student()
{
    StudentId = 2,
    Nanme = "eduardo"
};

Course curso = new Course()
{
   CourseId = 3,
   Name = "Programcion"
};

Al agregar el alumno al curso

curso.Students.add(alumno);

Me lanza la excepción siguiente:

NosupportedException
y tiene un mensaje diciendo algo sobre que la longitud es fija.

¿Porque me sale ese error?
¿como puedo agregar el estudiante al curso?

he estado buscando y en varios sitios y todos agregan el objeto a la colección a través del método add, pero no se porque me lanzara esa excepción.
¿tengo que hacer algo antes de poder agregar el objeto alumno?

estoy usando entity framework 6.

1 Respuesta

1voto

Pues lo primero que observo es que tus colecciones no están parametrizadas, deben lucir de la siguiente manera:

public virtual ICollection<Course> courses {get; set;}
public virtual ICollection<Student> students {get; set;}

Ahora, si de verdad las tienes parametrizadas y solo fue que te olvidaste de ponerlo en tu pregunta, debes hacer lo siguiente.

Suponiendo que éste sea tu modelo:

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

    public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

public class Course{
    public int CourseId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

public class StudentCourse{
    public int StudentId { get; set; }
    public int CourseId { get; set; }

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

Lo que debes hacer es definir tus relaciones en la clase Context, en el método OnModelCreating

protected override void OnModelCreateing(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<StudentCourse>()
       .HasKey(e => new { e.StudentId, e.CourseId });

   modelBuilder.Entity<Student>()
       .HasMany(e => e.StudentCourses)
       .WithRequired()
       .HasForeignKey(e => e.StudentId);

   modelBuilder.Entity<Course>()
       .HasMany(e => e.StudentCourses)
       .WithRequired()
       .HasForeignKey(e => e.CourseId);  
}

Inténtalo y me dices si te funcionó. Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta