none
Entity Framework update atributos anidados RRS feed

  • Pregunta

  • Hola a todos, paso a comentarles mi problema.

    Estoy trabajando con asp.net mvc2 y EF para mapear con sql server 2008.

    Mi problema es el siguiente:

    Tengo el siguiente modelo:

    http://1drv.ms/1yyyY0v

    Tengo el crud de Internacion donde se encuentran anidados todas sus dependencias

    *periodos->*actos_medicos... etc

    Para crear una instancia de Internacion no tengo problemas, el inconveniente surge cuando quiero pasar al Editar.

    A través de un partial le agregué a las clases ActoMedico, Practica y Ayudante la propiedad Delete de tipo boolean.(Solo se puede editar el último Periodo de la internación) 

    En el cliente ya está hecha la lógica para que envíe el delete en true en caso de que sea una instancia que esté persistidad en la base de datos.

    Cuando voy del lado del servidor,

    <HttpPost()> _
        Function Edit(ByVal id As Integer, ByVal collection As FormCollection) As ActionResult
    
    Dim internacion = _db.getInternacion(id)
          Try
            UpdateModel(internacion)
    '...

    Inspecciono el objeto internación y efectivamente me actualiza el modelo con los cambios que hice del lado del cliente.

    Todo aquello que borré aparece con el atributo delete en true, los datos de una instancia que modifico son correctos, y las nuevas instancias que creo aparecen agregadas a sus respectivas colecciones.

    Ahora bien, mi consulta es cúal y cómo es la mejor manera para borrar las instancias que tengo con delete=true ?

    Probé hacer esa funcionalidad a "pata" con la siguiente lógica: 

    For Each acto_medico As ActoMedico In internacion.periodo_abierto.actos_medicos
      For Each practica As Practica In acto_medico.practicas
        If practica.delete Then
          acto_medico.practicas.Remove(practica)
        End If
      Next
      For Each ayudante As Ayudante In acto_medico.ayudantes
        If ayudante.delete Then
          acto_medico.ayudantes.Remove(ayudante)
        End If
      Next
      If acto_medico.delete Then
        internacion.periodos.Last.actos_medicos.Remove(acto_medico)
      End If
    Next

    Pero al modificar la coleccion el foreach falla

    Espero la ayuda de la comunidad ;)

    Saludos


    viernes, 27 de febrero de 2015 22:51

Todas las respuestas

  • hola

    porque llamas Edit() a un actio que tendra la responsabilidad de eliminar una entidad? porque simplemente no lo llamas Delete()

    porque defines un paremtro como FormCollection si nunca lo vas  autilizar? porque veo que con solo el id alcanza

    Add/Attach and Entity States

    Entity Framework: Delete Entity by Id - Using Detached Instance

    la idea es que teniendo el id de la entidad puedes attacharlo al contexto y usar el State = EntityState.Deleted para eliminarlo

    si habilitas el mapping en cascada las entidades relacionadas tambien se eliminaran en el mismo proceso

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 1 de marzo de 2015 15:03
  • Hola Leandro, paso a contestarte:

    "porque llamas Edit() a un actio que tendra la responsabilidad de eliminar una entidad? porque simplemente no lo llamas Delete()"

    El action se llama edit, ya que es el editar de una internación. Como se puede ver en el modelo, la internación posee colecciones de entidades anidadas, con lo cual puede ser que se modifique alguno de los datos. En esa "edicion" puede estar incluido el eliminar un acto medico por ejemplo, pero siempre dentro del concepto de editar a la internación.

    "porque defines un paremtro como FormCollection si nunca lo vas  autilizar? porque veo que con solo el id alcanza" El formCollection lo tenia para debuggeo XD

    Comprendo lo que me decís, y te agradezco por la ayuda.

    Ahora te hago una consulta,

    Cómo hago para activar el mapping en cascada ?

    Estoy usando ef 4, y mvc 2.

    lunes, 2 de marzo de 2015 18:08
  • Una cosa más, no puedo hacer andar el delete con EF 4.0

    Hay alguna forma de hacer automático, que si la instancia del objeto tenga el atributo delete en true, entonces elimine dicha instancia?

    lunes, 2 de marzo de 2015 20:55