none
Borrado de elemento en relación one-to-many RRS feed

  • Pregunta

  • Buenas tardes,

    Tengo un problema que en principio debería funcionar así pero no funciona, me explico.

    Tengo las siguientes clases creadas para EF 5 code-first:

    public class Zona
    {
       public int ZonaId {get;set;}
       public string NombreZona {get;set;}
       public virtual IList<Calle> Calles {get;set;}
    }
    
    public class Calle
    {
       public int CalleId {get;set;}
       public string NombreCalle {get;set;}
    
       [Required]
       public virtual Zona Zona {get;set;}
    }
    
    

    El sentido común diría que para eliminar una calle de una zona solo habría que eliminarla de la lista "Calles" y luego llamar al SaveChanges del context, pero por lo visto esto no funciona así lo que bajo mi punto de vista limita bastante la forma de trabajar, sobre todo si hay que bajar al context y hacer otro tipo de operaciones como marcarla como eliminada y cosas por el estilo y tener que arrastrar el context hasta una capa superior (como un ViewModel en MVVM).


    EntityFramework lanza una excepción:
    "Una relación del AssociationSet  'Calle_Zona' se encuentra en el estado 'Deleted'. Dadas las restricciones de multiplicidad, una 'Calle_Zona_Source' correspondiente también debe estar en el estado 'Deleted'."

    ¿Cuál es la forma más lógica de proceder en este caso?

    • Editado David García Alonso miércoles, 16 de enero de 2013 19:36 Texto añadido de la excepción
    miércoles, 16 de enero de 2013 19:30

Todas las respuestas

  • alli lo que indica es que al eliminar una calle esta queriendo ademas eliminar la zona relacionada a esa calle, por eso falla

    de la lista de calles eliminas una lo cual se marca como Deleted, pero indica que la zona relacionada con la calle tambien se deberia marcar para eliminar, o quizas definir para que se elimine como cascada

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 17 de enero de 2013 18:20
  • Gracias por la respuesta.

    En realidad lo que trato de hacer es eliminar solo una calle de la zona, no toda la zona. Yo entiendo que con un:

    unaZona.Calles.Delete(unaCalle);

    debería eliminarse (que se elimina) unaCalle de la lista de Calles de la Zona (unaZona), pero al llamar al SaveChanges del context entonces es cuando protesta y salta la excepción. Evidentente la zona no debe eliminarse porque tiene otras calles en la lista.

    Entiendo la excepción y lo que significa, pero no entiendo porque para eliminar una calle tengo que eliminar toda la zona y todo lo que ello implica.

    ¿Y cual sería la forma de solventar esto?

    jueves, 17 de enero de 2013 18:53
  • tienes un metodo delete en el IList ?

    porque no haces un

    unaZona.Calles.Remove(unaCalle);

    ojo la calle debe ser una instancia de la lista, podrias usar linq para ubicarla

    despues haces el SaveChange()

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 17 de enero de 2013 19:33
  • Hola de nuevo,

    Perdón por el uso de un método "Delete" ya que evidentemente no existe, quería decir Remove que si existe en el IList.

    Evidentemente es lo que hago:

    unaZona.Calles.Remove(unaCalle);

    el elemento existe en la lista y lo elimina de la misma, pero al llamar al SaveChanges() es cuando salta la excepción.

    jueves, 17 de enero de 2013 19:48