martes, 4 de noviembre de 2014

[Entity Framework] Code First - Manejando Relaciones

 

Cuando se trabaja con entidades es muy raro que se encuentren aisladas por lo general estas se asocian con otras para colaborar.

Las asociaciones que trato en el video serán: uno a uno, uno a muchos o muchos a muchos.

 

 

Link


image

37 comentarios:

  1. Hola Leandro, le deje 2 comentarios en el 4:49, sobre DataKeysName, esperaria una respuesta suya, disculpe que lo moleste, le agradezco mucho.....nos vemos...

    ResponderEliminar
  2. hola Guillermo

    ahi respondi a la consulta en el otro articulos

    saludos

    ResponderEliminar
  3. Gracias Leandro, el tema ahora es meter los Campos Id de los DataKeyName de los tres diferentes GridsViews de donde los tomo (IdCurso, IdMateria, IdProfesor), en la Tabla CursosMaterias, que me los pide...

    No se si en el

    Parameters.AddWithValue = @());

    Mil Millones de gracias por responderme lo anterior y esto, abrazo....

    ResponderEliminar
  4. Como le va Leandro, lo molesto para recordarle que en el 4:49 le dejo una consulta para cerrar lo de guardar el DataKeyName que esta en una Variable, en una tabla ursosmaterias............Le agradezco mucho, disculpe, nos vemos...

    ResponderEliminar
  5. hola Guillermo

    no entendi, porque tienes 3 grids
    o como se une toda es informacion, pero basicamente si debes asignar esto a los parametros de la query que definas

    saludos

    ResponderEliminar
  6. Justamente, quiero saber que código usar para, según sus apuntes,los DataKeyNames, que los recupera en Variables, si después, con un Try, u otra cosa, los puedo guardar en una Tabla CursosMaterias a esos Ids de las Grillas a través de los DataKeyNames........Ej: quiero saber si esto esta bien, o que otra cosa, sintácticamente debo hacer:

    (Su ejemplo:)


    protected void gvMateria_SelectedIndexChanged(object sender, EventArgs e)

    {

    //
    // Se obtiene la fila seleccionada del gridview

    //

    GridViewRow row = gvMateria.SelectedRow;

    //
    // Obtengo el id de la entidad que se esta editando

    // en este caso de la entidad Materia
    //

    int idMateria = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);

    }

    protected void gvCurso_SelectedIndexChanged(object sender, EventArgs e)

    {

    //
    // Se obtiene la fila seleccionada del gridview

    //

    GridViewRow row = gvCurso.SelectedRow;

    //
    // Obtengo el id de la entidad que se esta editando

    // en este caso de la entidad Curso
    //

    int idCurso = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);

    }

    protected void gvProfesor_SelectedIndexChanged(object sender, EventArgs e)

    {

    //
    // Se obtiene la fila seleccionada del gridview

    //

    GridViewRow row = gvProfesor.SelectedRow;

    //
    // Obtengo el id de la entidad que se esta editando

    // en este caso de la entidad Profesor
    //

    int idCurso = Convert.ToInt32(gvProfesor.DataKeys[row.RowIndex].Value);

    }

    Aquí va lo mio:

    try
    {
    OleDbConnection cnn = new OleDbConnection();
    cnn.Open();
    string sql = string.Empty;
    sql = @"INSERT INTO CursosMaterias (id_Materia, id_Curso, Id_profesor)
    VALUES (@idMateria, @idCurso, @idProfesor)";
    OleDbCommand cmd = new OleDbCommand(sql, cnn);
    cmd.Parameters.AddWithValue("@idMateria", Convert.ToString(idMateria));
    cmd.Parameters.AddWithValue("@idCurso", Convert.ToString(idCurso));
    cmd.Parameters.AddWithValue("@idProfesor", Convert.ToString(idProfesor));
    }



    Esta bien esto para que los DataKeysNames, que se los recoge en Variables, entren en Tabla CursosMaterias??.....



    Gracias, Disculpe las molestias....
    Espero su respuesta..........Abrazo......

    ResponderEliminar
  7. hola Guillermo

    el tema es que las variables las estas definiendo de forma local en cada evento, despues de ejecutarse piedes esta informacion

    deberias usar el objeto Session o ViewState, para asignar los datos

    ViewState["idMateria"] = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);

    de esta forma cuando insertes tomas la info para insertar

    saludos

    ResponderEliminar
  8. Claro:

    Después, en:

    try
    {
    OleDbConnection cnn = new OleDbConnection();
    cnn.Open();
    string sql = string.Empty;
    sql = @"INSERT INTO CursosMaterias (id_Materia, id_Curso, Id_profesor)
    VALUES (@idMateria, @idCurso, @idProfesor)";
    OleDbCommand cmd = new OleDbCommand(sql, cnn);
    cmd.Parameters.AddWithValue("@idMateria", Convert.ToString(idMateria));
    cmd.Parameters.AddWithValue("@idCurso", Convert.ToString(idCurso));
    cmd.Parameters.AddWithValue("@idProfesor", Convert.ToString(idProfesor));
    }

    En cada

    cmd.Parameters.AddWithValue());

    pongo el ViewState[idMateria], por ejemplo.

    es asi, no?


    Disculpa que te moleste, espero respuesta de esto, Gracias Leandro, nos vemos....

    ResponderEliminar
  9. Otra cosa: se pueden borrar los comentarios, después??

    ResponderEliminar
  10. Lo que quiero saber es la sintaxis para ViewState si corresponde con

    cmd.Parameters.AddWithValue("@idMateria", Convert.ToString(idMateria));

    o que sintaxis usar para meter los Ids en la Tabla CursosMaterias antes apuntada....

    Disculpa las molestias y:

    (Se pueden borrar los Posts después???)

    Gracias, saludos..Nos vemos....

    ResponderEliminar
  11. Luego de incorporar en ViewState lo seleccionado en cada uno de los Tres Grids Independientes,
    tengo este código con ViewState para incorporarlo en la Tabla CursosMaterias:

    protected void ButtonAceptar_Click(object sender, EventArgs e)
    {
    try
    {
    OleDbConnection cnn = new OleDbConnection();
    cnn.Open();
    string sql = string.Empty;
    sql = @"INSERT INTO CursosMaterias (id_Materia, id_Curso, Id_persona)
    VALUES (@idMateria, @idCurso, @idProfesor)";
    OleDbCommand cmd = new OleDbCommand(sql, cnn);
    cmd.Parameters.AddWithValue("@idMateria", Convert.ToString(ViewState["idMateria"]));
    cmd.Parameters.AddWithValue("@idCurso", Convert.ToString(ViewState["idCurso"]));
    cmd.Parameters.AddWithValue("@idProfesor", Convert.ToString(ViewState["idProfesor"]));
    }

    Esta bien esto??, sino, como seria la sintaxis para, por ese ej:

    cmd.Parameters.AddWithValue("@idProfesor", Convert.ToString(ViewSttate["idProfesor"]));


    Gracias Leandro, Disculpa....

    ResponderEliminar
  12. La ultima pregunta es la misma que las dos Ultimas del 19/12...

    ResponderEliminar
  13. Disculpe Leandro que lo moleste, le agradecería si me pudiera responder el ultimo Post...............Disculpe, gracias....

    ResponderEliminar
  14. hola Guillermo

    no quieres seguir el tema en el foro de c# alli se puede publicar codigo y se analiza mucho mejor que el post en el blog

    el codigo que usa viewstate esta correcto, ademas imagino que estas ejecutandolo para comprobar que funcione
    quizas solo faltaria alguna verificacion si algun viewstate no tiene su dato asignado para que no falle

    saludos

    ResponderEliminar
  15. Gracias Leandro, el problema erael ViewState en

    Parameters.AddWithValue("@...."));

    no veo que se me llene la Tabla...

    Veo de pasarme a Foro de C#

    Mil Millones de Gracias, le mando un saludo por Navidad, y nos estamos viendo...

    saludos..

    ResponderEliminar
  16. Hola, Leandro, como le va?, me comunico para avisarle que le deje un post en el 11:31......Disculpe las molestias, gracias....

    ResponderEliminar
  17. Como le va Leandro, disculpe que lo moleste, me comunico para comentarle que en el Foro de c#, le hago una consulta con el tema:

    No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla 'Alumno'.

    Disculpe que lo moleste, estare siempre agradecido, nos vemos....

    ResponderEliminar
  18. Como le va Leandro, en el post este inmediato anterior, le dejo el Link que Ud. me solicito.........disculpe, saludos...

    ResponderEliminar
  19. Hola, Leandro, aquí va el link:

    https://social.msdn.microsoft.com/Forums/es-ES/f176ff1b-dd53-4260-a484-47a522c68ced/no-se-puede-agregar-o-cambiar-el-registro-porque-se-necesita-un-registro-relacionado-en-la-tabla?forum=webdeves

    Abrazo....

    ResponderEliminar
  20. hola Guillermo

    respondi en el foro

    saludos

    ResponderEliminar
  21. Leandro buenas tardes.
    anteriormente me dijiste q aparte de mapear hay q decirle en el get q te incluya ".Include(propiedad)"

    q sucede si quiero los usuarios con su propiedad perfiles y q los perfiles incluyan los menues??

    using (GigaContext context = new GigaContext())
    {
    return context.Set().Include("Perfiles").FirstOrDefault(x => x.Nombre == Nombre);
    }

    como a esa sentencia le dijo q perfil incluya menues?
    hay una forma de setear en el contexto o mapeo q por defecto me pueble alguna propiedad y otra no?

    Gracias

    ResponderEliminar
  22. Leandro ya lo logre , comparto:

    using (GigaContext context = new GigaContext())
    {
    return context.Set().Include("Perfiles").Include("Perfiles.Menues").FirstOrDefault(x => x.Nombre == Nombre);
    }

    Gracias

    ResponderEliminar
    Respuestas
    1. hola
      me alegro que pudieras solucionarlo
      Loading Related Entities
      como veras en el articulo el Include() puede definir una expresion lambada, no necesariamente tiene que ser un string
      igualmente no entendi porque usas un Set() en el contexto? ese set es una entidad? porque la verdad tiene un nombre algo raro

      saludos

      Eliminar
  23. Hola, Leandro, disculpe que lo moleste: puedo preguntarle??

    Debo llenar una columna de GridView con la fecha de hoy, y consegui este codigo que lo haria......Sin embargo, al implementarlo, me salen surayados los .Cells........Sabria Ud. como se solucionaria esto??.

    Dejo el codigo para que Ud. lo analice......Sepa disculpar las molestias...

    internal void GridNuevaAsist_RowDataBound(object sender, GridViewRowEventArgs e)
    {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    e.Row.Cells(3).Text = Convert.ToDateTime(e.Row.Cells(3).Text).ToString(DateTime.Today);
    }
    }

    ResponderEliminar
  24. Hola, Leandro, disculpe que lo moleste: puedo preguntarle??

    Debo llenar una columna de GridView con la fecha de hoy, y consegui este codigo que lo haria......Sin embargo, al implementarlo, me salen surayados los .Cells........Sabria Ud. como se solucionaria esto??.

    Dejo el codigo para que Ud. lo analice......Sepa disculpar las molestias...

    internal void GridNuevaAsist_RowDataBound(object sender, GridViewRowEventArgs e)
    {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    e.Row.Cells(3).Text = Convert.ToDateTime(e.Row.Cells(3).Text).ToString(DateTime.Today);
    }
    }

    ResponderEliminar
  25. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  26. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  27. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  28. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  29. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  30. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  31. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  32. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  33. Tuttini que tal, necesito ayuda, por donde podemos hablar? Saludos

    ResponderEliminar
  34. Hola, Leandro, disculpe que lo moleste, estoy consultando en foro c#, en las trabas de mi Proyecto ultimamente dado que rindo en Diciembre, y temo quedarme sin timepo, debo terminar cuanto antes para hacer revisiones, etc.....Le pido disculpas que me vea seguido por alli, por ello solicito ayuda para resolver.....y tambien quiero preguntar si hay limite de posteos por dia en le foro...... Disculpe las molestias, gracias....

    ResponderEliminar