2010-05-21 13 views
9

Estoy usando Entity Framework 4 y tengo una relación uno a muchos entre una entidad principal y otra secundaria. Estoy tratando de eliminar a un niño mediante el repositorio padre quitándolo de colección de los niños de los padres:¿Cómo elimino una entidad hija de una colección principal con Entity Framework 4?

public virtual void RemoveChild(Child child) 
     { 
      children.Remove(child); 
     } 

Cuando trato de guardar los cambios me sale el siguiente error:

A relationship from the 'ParentChild' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Child' must also in the 'Deleted' state.

Ciertamente yo ¡no es necesario eliminar la entidad hija explícitamente usando un repositorio hijo!

Respuesta

1

Depende de si tiene una cascada en la base de datos. Si lo hace (y dada su pregunta, probablemente debería hacerlo), entonces esto debería ser automático. You can read about this here.

+0

Gracias, pero estoy eliminación de un niño no es el padre . Intenté poner cascada en eliminar en el elemento primario y obtuve el mismo error. El padre es la raíz agregada así que estoy usando el repositorio padre para eliminar uno de sus hijos. ¿Conoces la mejor manera de hacer esto? Cualquier ayuda sería muy apreciada. – simonjreid

+1

En este caso, la eliminación de la relación elimina al niño si (1) el FK del padre está en el PK del niño y (2) hay una cascada. Ver http://blogs.msdn.com/dsimmons/archive/2010/01/31/deleting-foreign-key-relationships-in-ef4.aspx –

+1

Muchas gracias Craig. Creo que mi escenario se encuentra en el Caso 1 de ese artículo: el FK de los padres no está en PK del niño. Entonces parece que tendré que eliminar al niño yo mismo. Parece que las futuras versiones podrían encargarse de esto ... – simonjreid

1

En EF4, si los objetos secundarios y el objeto principal están todos conectados al ObjectContext, EF mantendrá las referencias de clave externa y las referencias de objeto sincronizadas tanto en el elemento primario como en el elemento secundario afectado.

3

Lo que he encontrado para resolver este problema es la anulación follwoing en el DbContext:

public override int SaveChanges() 
{ 
    Set<Child>() 
    .Local 
    .Where(r => !Parent.Local.SelectMany(s => s.Children).Contains(r)) 
    .ToList() 
    .ForEach(r => Set<Child>().Remove(r)); 

    return base.SaveChanges(); 
} 

Tome un vistazo aquí: http://blog.oneunicorn.com/2012/06/02/deleting-orphans-with-entity-framework/

Cuestiones relacionadas