first - Entity Framework-Clear a Child Collection
entity framework example (3)
Clear()
elimina la referencia a la entidad, no a la entidad misma.
Si intenta que esto sea siempre la misma operación, podría manejar el cambio de AssociationChanged
:
Entity.Children.AssociationChanged +=
new CollectionChangeEventHandler(EntityChildrenChanged);
Entity.Children.Clear();
private void EntityChildrenChanged(object sender,
CollectionChangeEventArgs e)
{
// Check for a related reference being removed.
if (e.Action == CollectionChangeAction.Remove)
{
Context.DeleteObject(e.Element);
}
}
Puedes construir esto en tu entidad usando una clase parcial.
Me encontré con un problema interesante con Entity Framework y, basado en el código que tuve que usar para abordarlo, sospecho que mi solución es menos que ideal. Tengo una relación de 1 a muchos entre la Tabla A y la Tabla B donde las entidades en la Tabla B tienen una referencia a la Tabla A. Tengo un escenario en el que quiero eliminar simultáneamente todos los elementos secundarios de una fila en TableA y pensé que esto podría lograrse simplemente borrando la colección:
Entity.Children.Clear()
Lamentablemente, cuando intenté guardar los cambios, esto se produjo como una violación de clave externa.
Se está agregando o eliminando una relación de un conjunto de asociaciones ''FK_EntityB_EntityA''. Con restricciones de cardinalidad, también se debe agregar o eliminar una ''Entidad B'' correspondiente.
La solución que se me ocurrió fue eliminar manualmente el objeto a través del DeleteObject () del contexto de la entidad, pero sé que esta lógica que estoy usando tiene que ser incorrecta.
while (collection.Any())
Entities.DeleteObject(collection.First());
Por un lado, el hecho de que tuve que usar un bucle Where () parece mucho menos que ideal, pero supongo que es puramente una evaluación semántica de mi parte. En cualquier caso, ¿hay algo mal con la forma en que estoy haciendo esto, o quizás haya una mejor manera de borrar una colección de entidades hijo de una entidad de modo que Entity Framework llame correctamente a una eliminación de almacén de datos en todos los objetos eliminados?
Puede crear una relación de identificación entre las entidades principales y secundarias y EF eliminará la entidad secundaria cuando la elimine de la colección primaria.
public class Parent
{
public int ParentId {get;set;}
public ICollection<Child> Children {get;set;}
}
public class Child
{
public int ChildId {get;set;}
public int ParentId {get;set;}
}
Configuración de mapeo:
modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId });
modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);
Truco: al configurar la relación entre el padre y el hijo, tendrá que crear una clave "compuesta" en el niño. De esta forma, cuando le diga al padre que elimine 1 o todos sus hijos, los registros relacionados se borrarán de la base de datos.
Para configurar la clave compuesta usando Fluent API:
modelBuilder.Entity<Child>().HasKey(t => new { t.ParentId, t.ChildId });
Luego, para eliminar los niños relacionados:
var parent = _context.Parents.SingleOrDefault(p => p.ParentId == parentId);
var childToRemove = parent.Children.First(); // Change the logic
parent.Children.Remove(childToRemove);
// you can delete all children if you want
// parent.Children.Clear();
_context.SaveChanges();
¡Hecho!