none
cual es la mejor forma de grabar un Maestro / detalle RRS feed

  • Pregunta

  • Buenas tardes foristas.

     mi escenario es VS2010, EF4, C#, STE

    quisiera saber cual es la mejor forma de grabar un maestro detalle en EF4, ObjectDataSource y STE (Self Tracking Entities), pues no he podido encontrar un ejemplo claro y conciso de como hacerlo haciendo uso de las características del EF, he visto algo como PADRE.HIJO.ADD(hijoEntity), pero no logro aterrizar la idea de como hacerlo funcionar, por el momento grabo el encabezado, luego recupero el ID grabado y grabo separadamente el detalle, pero no me parece la mejor forma de hacerlo...

    ojala me puedan ayudar con este tema, les estaré muy agradecido, y si no es mucho pedir, algun codigo de ejemplo donde pueda ver bien la relacion VISTA (Aspx y Aspx.cs), y Logic (BLs)  


    miércoles, 11 de mayo de 2011 22:43

Respuestas

  • Hola Milton, este método que te paso lo acabo de probar y funciona sin ningun problema :

            using (PruebasEntities db = new PruebasEntities())
            {
              DocsPadre dp = new DocsPadre();
              dp.detallePadre = "Primer Padre";
              dp.fechaPadre = DateTime.Now.Date;
    
              DocsHijos dh1 = new DocsHijos();
              dh1.detalleHijo = "Padre 1, Hijo 1";
              dh1.cantidadHijo = 1;
              dh1.valorHijo = 10;
              dp.DocsHijos.Add(dh1);
    
              DocsHijos dh2 = new DocsHijos();
              dh2.detalleHijo = "Padre 1, Hijo 2";
              dh2.cantidadHijo = 2;
              dh2.valorHijo = 20;
              dp.DocsHijos.Add(dh2);
    
              DocsHijos dh3 = new DocsHijos();
              dh3.detalleHijo = "Padre 1, Hijo 2";
              dh3.cantidadHijo = 2;
              dh3.valorHijo = 20;
              dp.DocsHijos.Add(dh3);
    
              db.AddToDocsPadre(dp);
              db.SaveChanges();
            }
    

     

    No es necesario grabarle a los hijos el ID del padre ya que con el hecho de que adiciones hijos a un padre el en el momento de persistir resuelve el ID del padre para los hijos.

     

    Cordial saludo,

     

     

     


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    • Marcado como respuesta milson cardona sábado, 28 de mayo de 2011 0:07
    jueves, 26 de mayo de 2011 21:55
  • Muchas gracias a todos por sus respuestas y a ti JA Reyes por la preocupacion.

     

    si finalmente solucione el problema, lo que hice es similar a tu consejo.

    puse un solo boton en mi formulario. y en el click de ese boton en el formulario y lo que hice fue recojer los datos de cada FORMVIEW, y ponerlos en cada una de las entidades involucradas

     

    mas o menos asi, tenemos los 2 FORMVIEW (persona y profesor) y un boton grabar en la vista, y detras en el evento click del boton ponemos 

     //informaciondel profesor 
      Profesores _profesor = new Profesores();
      _textBox = (TextBox)FormViewProfesor.FindControl("TextBoxObservacionesProfesor");
      _profesor.ObservacionesProfesor = _textBox.Text;

      //informacion de la persona
      Personas _persona = new Personas();
      _dropDownList = (DropDownList)FormView1.FindControl("DdlTipoDocumento");
      _persona.TipoDocumento = _dropDownList.SelectedValue;

    _textBox = (TextBox)FormView1.FindControl("TbNumeroDocumento");
    _persona.NumeroDocumento = (Int32)int.Parse(_textBox.Text);

     

    //ahora adicionamos la información del profesor a la persona para que se grabe en una sola transaccion
    _persona.Profesores = _profesor;

     

    //POR ULTIMO llamamos al metodo que graba
    (new ProcesosFacade()).InsertPersona(_persona);

    funcionó bien, aunque ahora tengo otro problema que ya mismo preguntare en otros POST

     

    gracias amigos y espero les el ejemplo a otra persona que tenga el mismo problema

     



    viernes, 27 de mayo de 2011 20:05

Todas las respuestas

  • Hola Milsom,

    Mira si este otro hilo te puede ser de ayuda:

    http://social.msdn.microsoft.com/Forums/en-ZA/adodotnetentityframework/thread/f54273f7-6cdf-4f82-b184-0790c53bef0c

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    jueves, 12 de mayo de 2011 8:49
  • JA Reyes, que pena contigo amigo, y disculpame la insistencia, ya estuve mirando el enlace que me enviaste, de hecho ya lo habia visto en la mañana de ayer, y en verdad es muy interesante, pero tratan un tema muy puntual, algunos problemas a la hora de borrar los hijos de un padre.

     

    pero yo necesito algo mas general, que por mas que he buscado no encuentro, en terminos generales necesito un ejemplo de una pagina My_Page.aspx (y su correspondiente MyPage.aspx.cs) que tenga dos formularios, en uno ingreso un padre, en el segundo ingreso sus hijos, que DEBO HACER para mandarle ese padre con los hijos relacionados a mi capa de BUSINESS, la clase MyLogicBL.cs (que implementa las operaciones CRUD sobre el padre) para que tanto el padre como sus hijos se graben en una sola transacción.

     

    espero darle un poco de claridad a mi problema. 

    jueves, 12 de mayo de 2011 13:46
  • Hola Milson,

    Si quieres realizar todo el proceso de actualización en un solo paso, deberias utilizar Agregados. Esto es, tienes una entidad Raiz (master) y una serie de entidades hijas (details) que estan vinculadas en tu modelo EDMX mediante una relación. De este modo en tu modelo STE podras acceder a los hijos haciendo Padre.Hijos y, por ejemplo, añadirias un nuevo hijo haciendo Padre.Hijos.Add(nuevoHijo). De tal forma que al hacer contexto.SaveChanges(Padre) ya se guardaría todo a la vez.

    Para poder compartir datos entre 2 páginas deberías utilizar algún mecanismo que te permita pasar el Padre de una página a la otra. Por ejemplo, podiendo Padre en Session en la página My_Page.aspx.cs y recogiendo este valor en My_PageHijo.aspx.cs. Para indicar que detalle debes mostrar podrías pasar el valor por querystring:  My_PageHijo.aspx?padre=2&hijo=5.

    Si te quedan dudas, ya intentaré localizar algún ejemplo que te pueda resultar más clarificador.

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    jueves, 12 de mayo de 2011 15:19
  • Hola Milson,

    Pudiste finalmente solucionar tu problema?

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    • Marcado como respuesta milson cardona sábado, 28 de mayo de 2011 0:08
    • Desmarcado como respuesta milson cardona sábado, 28 de mayo de 2011 0:08
    miércoles, 25 de mayo de 2011 8:15
  • Hola Milton, este método que te paso lo acabo de probar y funciona sin ningun problema :

            using (PruebasEntities db = new PruebasEntities())
            {
              DocsPadre dp = new DocsPadre();
              dp.detallePadre = "Primer Padre";
              dp.fechaPadre = DateTime.Now.Date;
    
              DocsHijos dh1 = new DocsHijos();
              dh1.detalleHijo = "Padre 1, Hijo 1";
              dh1.cantidadHijo = 1;
              dh1.valorHijo = 10;
              dp.DocsHijos.Add(dh1);
    
              DocsHijos dh2 = new DocsHijos();
              dh2.detalleHijo = "Padre 1, Hijo 2";
              dh2.cantidadHijo = 2;
              dh2.valorHijo = 20;
              dp.DocsHijos.Add(dh2);
    
              DocsHijos dh3 = new DocsHijos();
              dh3.detalleHijo = "Padre 1, Hijo 2";
              dh3.cantidadHijo = 2;
              dh3.valorHijo = 20;
              dp.DocsHijos.Add(dh3);
    
              db.AddToDocsPadre(dp);
              db.SaveChanges();
            }
    

     

    No es necesario grabarle a los hijos el ID del padre ya que con el hecho de que adiciones hijos a un padre el en el momento de persistir resuelve el ID del padre para los hijos.

     

    Cordial saludo,

     

     

     


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    • Marcado como respuesta milson cardona sábado, 28 de mayo de 2011 0:07
    jueves, 26 de mayo de 2011 21:55
  • Muchas gracias a todos por sus respuestas y a ti JA Reyes por la preocupacion.

     

    si finalmente solucione el problema, lo que hice es similar a tu consejo.

    puse un solo boton en mi formulario. y en el click de ese boton en el formulario y lo que hice fue recojer los datos de cada FORMVIEW, y ponerlos en cada una de las entidades involucradas

     

    mas o menos asi, tenemos los 2 FORMVIEW (persona y profesor) y un boton grabar en la vista, y detras en el evento click del boton ponemos 

     //informaciondel profesor 
      Profesores _profesor = new Profesores();
      _textBox = (TextBox)FormViewProfesor.FindControl("TextBoxObservacionesProfesor");
      _profesor.ObservacionesProfesor = _textBox.Text;

      //informacion de la persona
      Personas _persona = new Personas();
      _dropDownList = (DropDownList)FormView1.FindControl("DdlTipoDocumento");
      _persona.TipoDocumento = _dropDownList.SelectedValue;

    _textBox = (TextBox)FormView1.FindControl("TbNumeroDocumento");
    _persona.NumeroDocumento = (Int32)int.Parse(_textBox.Text);

     

    //ahora adicionamos la información del profesor a la persona para que se grabe en una sola transaccion
    _persona.Profesores = _profesor;

     

    //POR ULTIMO llamamos al metodo que graba
    (new ProcesosFacade()).InsertPersona(_persona);

    funcionó bien, aunque ahora tengo otro problema que ya mismo preguntare en otros POST

     

    gracias amigos y espero les el ejemplo a otra persona que tenga el mismo problema

     



    viernes, 27 de mayo de 2011 20:05
  • Hola de nuevo Milson,

    Me alegro que finalmente se resolviera el problema.

    Si alguna de las respuestas anteriores te sirvió de ayuda, puedes "Marcarla como respuesta" y así cualquier otro usuario con tu mismo problema podrá localizar mucho más facilmente la solución.

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    viernes, 27 de mayo de 2011 21:30
  • si JA Reyes, ya marque como respuesta correcta el ejemplo de Mauricio porque teoricamente asi se hace y el pequeño ejemplo que yo puse, porque en la practica asi me funcionó, y ambos se basan en la primera aproximación que hiciste tu...  

    no sé si mi ejemplo sea la mejor forma mas prática... si alguien tiene un codigo mas optimo, bienvenido sea

    un saludo

    sábado, 28 de mayo de 2011 0:12
  • Perfecto,

    Así se reconoce la dedicación de otros usuarios con la comunidad, así como se facilita las búsquedas a otros usuarios con el mismo problema.

    Los comentarios que te sirvieron de ayuda también los puedes "Votar como útil".

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    sábado, 28 de mayo de 2011 11:14
  • Buenas tardes,

    Implemente el ejemplo pero no he podido solucionar me sigue saliendo el mismo error al momento de grabar el hijo ya que dice que el valor utilizado para el campo de la llave no se encuentra en el debug me aparece cero (0).

    Osea en otras palabras no esta asignandome dinamicamente el nuevo ID del pabre para poder usarlo en el hijo.

    Espero alguna ayuda gracias mi base de datos es oracle. Utilizo MVC4 Con entity Frameworks.

    miércoles, 10 de diciembre de 2014 18:28