none
Eliminar un objecto de un BindingSource enlazado a EF RRS feed

  • Pregunta

  • Hola a todos, les comento el problema que estoy teniendo entre el Entity Framework y el control BindingSource.

    En primer lugar les muestro el modelo con el que estoy trabajando:

    En el proyecto tengo añadido dos BindingSource, uno que está enlazado al contexto de datos directamente mediante:

    productoBindingSource.DataSource = contexto.Productos;

    y un segundo BindingSource (composicionBindingSource) que enlaza a la composición de dicho producto, que usando el diseñador le aplico como DataSource el productoBindingSource y como DataMember, la lista Composiciones de productoBindingSource.

    Todo lo anterior está enlazado a varios controles y el composicionBindingSource está enlazado a un DataGrid (que en éste caso es el control XtraGrid).

    El problema que tengo no me surge al añadir productos con sus correspondientes composiciones, sino a la hora de eliminar composiciones. Cuando elimino una composicion, se borra correctamente del XtraGrid y del BindingSource (composicionBidingSource) pero al guardar los cambios en el contexto me da el siguiente error:

    Una relación del AssociationSet  'ComposicionProducto' se encuentra en el estado 'Deleted'. Dadas las restricciones de multiplicidad, una 'Composicion' correspondiente también debe estar en el estado 'Deleted'.

    Según me he fijado en el depurador (en el ObjectStateManager del contexto), he visto que se está marcando correctamente la eliminación de la relación entre el producto y la composición que he borrado, pero no se ha marcado la composición (_deletedEntityStore = null)


    ¿Cómo puedo solucionarlo?.



    • Editado Spaikers jueves, 25 de octubre de 2012 21:37
    jueves, 25 de octubre de 2012 21:36

Respuestas

  • Gracias por responder Leandro.

    En principio el tema no está en el borrado en cascada ya que hasta donde entiendo, eso sería útil si elimino el producto, pero en éste caso lo que quiero es eliminar un elemento de la lista de composiciones.

    Finalmente he dado con el error y básicamente está en el control XtraGrid, ya que al eliminar el elemento con el navegado embebido que tiene, hay que usa e.Handle = true, quedando así:

                if (e.Button.ButtonType == NavigatorButtonType.Remove)
                {
                    e.Handled = true;
                    contexto.Composiciones.DeleteObject((Composicion)composicionBindingSource.Current);
                }

    Gracias por responder tan rápido Leandro.



    • Editado Spaikers jueves, 25 de octubre de 2012 22:04
    • Marcado como respuesta Spaikers jueves, 25 de octubre de 2012 22:04
    jueves, 25 de octubre de 2012 22:03

Todas las respuestas

  • el tema es que si es composicion no deberias habilitar el borrado en cascada

    o sino recorrer las entidades relacionadas al producto que eliminas y marcarlo tambien para borrar


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 25 de octubre de 2012 21:47
  • Gracias por responder Leandro.

    En principio el tema no está en el borrado en cascada ya que hasta donde entiendo, eso sería útil si elimino el producto, pero en éste caso lo que quiero es eliminar un elemento de la lista de composiciones.

    Finalmente he dado con el error y básicamente está en el control XtraGrid, ya que al eliminar el elemento con el navegado embebido que tiene, hay que usa e.Handle = true, quedando así:

                if (e.Button.ButtonType == NavigatorButtonType.Remove)
                {
                    e.Handled = true;
                    contexto.Composiciones.DeleteObject((Composicion)composicionBindingSource.Current);
                }

    Gracias por responder tan rápido Leandro.



    • Editado Spaikers jueves, 25 de octubre de 2012 22:04
    • Marcado como respuesta Spaikers jueves, 25 de octubre de 2012 22:04
    jueves, 25 de octubre de 2012 22:03