lunes, 3 de noviembre de 2014

[Entity Framework] Code First - Consultando entidades

 

Después de configurar el modelo será necesario aprender a operar con el mismo para obtener la información que nuestra aplicación necesita.

Las queries linq que definamos serán transformadas a consultas sql dinámicamente por EF, por eso es importante entender como funcionan, aquí verán como trabajar entidades simple, como agruparlas, herencia, tipos dinámicos, etc.

 

 

Link


image

36 comentarios:

  1. Hola Leandro, disculpe que lo moleste, le escribo para solicitar su ayuda con el fin que me diga si este código que coloco a continuacion esta bien para cuando aprieto un Boton Aceptar, después de haber seleccionado filas en Tres Grids Views diferentes, los datos de la columna de interés de esas filas, las guardo en variables que luego son llamadas en

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

    si Ud. conoce algo diferente o el mismo código señalando los errores para que funcione, seria de mi mayor agradecimiento hacia Ud, si me suma en esto, solucionando esto, doy un paso hacia adelante en uno de los ultimos webForms para finalizar mi Tesis.

    Le envio un saludo grande:

    Guillermo







    protected void ButtonAceptar_Click(object sender, EventArgs e)
    {
    foreach (GridViewRow row in GridMateria.Rows)
    {
    CheckBox check1 = row.FindControl("CheckBox1") as CheckBox;

    if (check1.Checked)
    {
    string idMateria = row.Cells[0].ToString();
    }
    }

    foreach (GridViewRow row in GridCurso.Rows)
    {
    CheckBox check2 = row.FindControl("CheckBox2") as CheckBox;

    if (check2.Checked)
    {
    string idCurso = row.Cells[0].ToString();
    }
    }

    foreach (GridViewRow row in GridProfesor.Rows)
    {
    CheckBox check3 = row.FindControl("CheckBox3") as CheckBox;

    if (check3.Checked)
    {
    string idProfesor = row.Cells[0].ToString();
    }
    }
    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.ToInt32(idMateria.Text));
    cmd.Parameters.AddWithValue("@idCurso", Convert.ToString(idCurso.Text));
    cmd.Parameters.AddWithValue("@idProfesor", Convert.ToString(idProfesor.Text));
    }

    ResponderEliminar
  2. PD: es para llenar una Tabla CursosMaterias, para que me figuren solo los Ids de Curso, de Materia, y de Profesor.........Es decir, a Curso le asigno Materia y también el Profesor que la dicta..............Gracias

    ResponderEliminar
  3. Aprovecho la oportunidad hoy 9 de Diciembre de 2014 para saludarlo por el Dia del Informatico............Feliz dia, Usted se lo merece........

    ResponderEliminar
  4. Espero que haya una respuesta para mi..........Disculpe, Gracias.....

    ResponderEliminar
  5. hola Guillermo

    lo que noto es que realizas un foreach por cada grid tomando los check de cada uno, esto va a generar una combinatoria de opciones, pero no se si es lo que buscas

    no seria mejor tener un unico grid y por sobre este 3 combos en donde selecciones curso, profesor y materia y con un boton "agregar" añadas una nueva row al grid

    entonces en el grid solo muestras las relaciones, es mas podrias hasta validar si hay alguna relacion existente y evitar que se duplique

    aqui tienes varias opciones cuando presionas el boton "agregar" insertas directamente, o sino puede ir agregando en un objeto List<> en Session y al aceptar recorres la lista he insertas

    creo que hacerlo de esta forma seria mucho mas simple que con 3 grid y checkbox

    saludos

    ResponderEliminar
  6. Dale Leandro, veo, estudio opciones...............Mil millones de gracias, disculpa las molestias.............

    ResponderEliminar
  7. El tema es que a un Curso(debo tomar solo su Id) le debo agregar las Materias que contiene, y luego, el Profesor a cada Materia..........Luego, en otro Grid aparte, en otro webForm, se veria la combinación......

    ResponderEliminar
  8. El tema es como meto las Variables donde guardo el valor de los Id de la celda

    (if (check1.Checked)
    {
    int idMateria = row.Cells[0].ToString();
    }

    en

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


    Como hago para meter esas Variables en Parametros.AddWithValue


    Pregunto, Gracias, Abrazos...

    ResponderEliminar
  9. hola Guillermo

    Para eso deberias definir el DataKeyNames con el campo que represente el id
    El valor lo tomas usando el DataKeys

    Tengo un articulo que explico como usarlo
    [ASP.NET][GridView] - Como seleccionar una fila

    saludos

    ResponderEliminar
  10. Leandro buenos dias,

    llevo tiempo siguiendo tus publicaciones la verdad EF ha sido de gran utilidad para mi, necesito realizar una aplicacion en donde existe varios origenes de datos Ej. Mysql esta la tabla usuarios, Sql Server la tabla compras, en la misma aplicacion yo necesito utilizar esos 2 origenes de datos, por lo que se me ocurrio crear un datacontext por cada origen de datos con sus respectivas entidades.

    Actualmente, hice el ejercicio y con el sql server se me conecta, con mysql me muestra la pantalla pero no me muestra los datos, mirando las excepciones el problema es que no tenia relacionado el providers en el app.config, he encontrado en internet varios pero sigo sin poder acceder a los datos, mi version de entity es 6.0.0, y mi version de mysql connect es 6.9.5

    ResponderEliminar
  11. muchas gracias leandro, me ha servido mucho, queria preguntarte si dentro de tu experiencia conoces algun dll con el que usuarios finales puedan hacer consultas en la base de datos y generar reportes personalizados, es decir que ellos puedan decir que informacion quieren obtener

    ResponderEliminar
  12. hola ksoto

    la verdad que algo tan dinamico como para que el usuario pueda editar el reporte hay pocas opciones

    se que Reporting Service tiene una opcion para esto
    Tutorial: Creating a Report Model
    pero la verdad nunca lo he implementado

    saludos

    ResponderEliminar
  13. Lenadro buenas tardes,

    Tengo una situacion, estamos desarrollando una aplicacion para varios clientes, esta aplicacion la estamos haciendo con EF codefirst, para la mayoria de clientes se toman todos los datos desde una base de datos unica, pero para algunos hay cosas que dilignecian en un formulario y que consultan de una vista en ora base de datos, te doy un ejemplo; se tiene el formulario solicitud que tiene consecutivo fecha y empleado, en el campo empleado debe ir el empleado que solicita, pero a nivel de mi proyecto pertenece a la tabla nomempleado, sin embargo hay 2 o tres clientes que no consultan el codigo que llena el formulario de esa tabla de la misma base de datos si no de una vista lo que me gustaria seria que la aplicacion consultara esa vista sin yo tener que decirle que es una vista o que tenga que cambiar el codigo fuente, espero tu ayuda.

    Gracias

    ResponderEliminar
  14. hola ksoto

    es que la vista vas a tener que mapearla para poder accederla

    quizas podrias mapear la vista y la tabla a entidades diferentes he invocar una u otra segun sea el caso

    al tener dos origenes de datos la logica hay que definirla para ambos casos de forma dinamica en runtime no se puede resolver el mapping de las entidades

    saludos

    ResponderEliminar
  15. 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
  16. Como le va Leandro, en el post este inmediato anterior, le dejo el Link que Ud. me solicito.........disculpe, saludos...

    ResponderEliminar
  17. hola Guillermo

    respondi en el link del foro


    saludos

    ResponderEliminar
  18. Buenos dias leandro yo siempre estoy siguiendo tus post, me parecen muy interesantes, pero me ha quedado la interrogante, soy bastante nuevo con esto del framework y mi consulta es, si ya tengo una base de datos ya creada como la enlazo y obtengo sus entidades sin necesidad de mapearlas, es esto posible o es necesario hacerlo. Gracias por la atención.

    ResponderEliminar
    Respuestas
    1. hola
      Si la idea es hacer uso de Code First podrias usar el wizard que te ayude a crear el mapping, analiza el articulo
      Reset all the items in a form
      alli veras como por medio del wizard podras mapear la db existente
      saludos

      Eliminar
    2. Yo poseo el VS2012 pero no me aparece esa opción de wizard :/ como le puedo hacer.

      Eliminar
    3. Gracias por responder, saludos desde Bolivia.

      Eliminar
  19. Bueno muchas gracias todavía no he podido probarlo pero ya me dio las pautas a seguir, gracias por las molestias. Saludos Leandro.

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

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

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

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

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

    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. 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