En términos de entidades (u objetos), tiene un Class
objeto que tiene una colección de Students
y un Student
objeto que tiene una colección de Classes
. Dado que su StudentClass
tabla solo contiene los ID y ninguna información adicional, EF no genera una entidad para la tabla de unión. Ese es el comportamiento correcto y eso es lo que esperas.
Ahora, cuando haga inserciones o actualizaciones, intente pensar en términos de objetos. Por ejemplo, si desea insertar una clase con dos estudiantes, cree el Class
objeto, los Student
objetos, agregue los estudiantes a la Students
colección de la clase , agregue el Class
objeto al contexto y llame SaveChanges
:
using (var context = new YourContext())
{
var mathClass = new Class { Name = "Math" };
mathClass.Students.Add(new Student { Name = "Alice" });
mathClass.Students.Add(new Student { Name = "Bob" });
context.AddToClasses(mathClass);
context.SaveChanges();
}
Esto creará una entrada en la Class
tabla, dos entradas en la Student
tabla y dos entradas en la StudentClass
tabla uniéndolas.
Básicamente, haces lo mismo con las actualizaciones. Simplemente obtenga los datos, modifique el gráfico agregando y eliminando objetos de las colecciones, llame SaveChanges
. Consulte esta pregunta similar para obtener más detalles.
Editar :
De acuerdo con su comentario, debe insertar uno nuevo Class
y agregar dos existentes Students
:
using (var context = new YourContext())
{
var mathClass= new Class { Name = "Math" };
Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
mathClass.Students.Add(student1);
mathClass.Students.Add(student2);
context.AddToClasses(mathClass);
context.SaveChanges();
}
Dado que ambos estudiantes ya están en la base de datos, no se insertarán, pero como ahora están en la Students
colección de Class
, se insertarán dos entradas en la StudentClass
tabla.
Pruebe este para actualizar:
fuente
Quería agregar mi experiencia a eso. De hecho, EF, cuando agrega un objeto al contexto, cambia el estado de todos los elementos secundarios y entidades relacionadas a Agregado. Aunque hay una pequeña excepción en la regla aquí: si los niños / entidades relacionadas están siendo rastreados por el mismo contexto, EF entiende que estas entidades existen y no las agrega. El problema ocurre cuando, por ejemplo, carga los niños / entidades relacionadas de algún otro contexto o una interfaz de usuario web, etc. y luego sí, EF no sabe nada sobre estas entidades y las agrega todas. Para evitar eso, simplemente obtenga las claves de las entidades y búsquelas (por ejemplo,
context.Students.FirstOrDefault(s => s.Name == "Alice"))
en el mismo contexto en el que desea hacer la adición.fuente
Utilizo la siguiente forma para manejar la relación de muchos a muchos donde solo están involucradas claves externas.
Entonces para insertar :
Para borrar ,
fuente
En el marco de la entidad, cuando el objeto se agrega al contexto, su estado cambia a Agregado. EF también cambia el estado de cada objeto para agregarlo en el árbol de objetos y, por lo tanto, obtiene un error de violación de clave principal o se agregan registros duplicados en la tabla.
fuente