none
Extendiendo Entidades RRS feed

  • Pregunta

  • Amigos veo el poder que se tiene con el EF pero existe alguna manera de poder hacer mi propia clase, extendiendola a partir de una Entidad que ya se tiene modelada ?

     


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    lunes, 12 de abril de 2010 20:40

Todas las respuestas

  • Buenos Dias J.Fernando Galvez,

    Si se puede extender un Objecto que tengas modelado en tu EF...

    Te explico... Sabes que cuando se usa el EF. El EF crea la clase con la metadata que extrae de la base de datos de ese object, en  mi caso, programo en C#, el crearia N Clases en C# de las N Tablas que selecciones en el Wizard...

    Entonces.. ya que tienes las Clases de tus objects en C#... tu puedes crear Clases Parciales!... Estas clases parciales son iguales Logicamente! pero Fisicamente estan en archivos distintos...

    Como hacemos esto?
    Agregas un ARchivo de Clase en tu Proyecto y luego colocas en el codigo: 

    public partial class TUOBJECTO
    {

    Y listo,  aqui dentro colocaras las propiedades, metodos y/o Extensiones que desees!

    }

     

    Saludos!
    Cualquier duda, no dudes en preguntar por aqui!


    Marca la Respuesta como correcta si te es util.
    MCPD - Web Developer
    MCTS - .Net Framework 2.0, Web Applications, SQL Server 2005
    jueves, 15 de abril de 2010 14:36
  • millon de gracias me podrias dar unas cuantas pautas por que lo que deseo hacer es hacer una funcion pero que retorne la consulta del EF usando linq me explico un poco digamos que tengo la tabla ESTUDIANTE y AULA lo obviamente un estudiante tiene asignadas varias aulas y al hacer la consulta por la llave del estudiante para ver solo las aulas de un determinado estudiante deseo devolver nose si un objeto  o como devolver para trabajar con lo que retorne ya que estoy abstrayendo un poco la capa de acceso de datos .

    quedaria asi

     

    public OBJETO getAlgo()
    {
    //retornar la consulta de linq
    ......
    }
    claro que lo que deseo retornar es una mix de tablas los datos de ESTUDIANTE Y AULA y mi primera idea fue crear una clase que tenga esos 2 objetos como propiedades pero talvez exista otra forma gracias.. :D

     


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    jueves, 15 de abril de 2010 17:13
  • Hola Fernando.

    Si podrias crear otra clase que te devolviera los datos de ambos objects, pero no es te lo recomiendo, como Buenas Practicas...

    OJO: Depende como hiciste la arquuitectura de tablas en tu DB...

    Para mi deberia ser asi la arquitectura...

    Un Aula tiene MUCHOS alumnos..
    Un Alumno tiene MUCHAS aulas...
    Es una relacion de Mucho a Mucho...

    En base de datos lo tendria asi...

    Tablas

    Alumno --------> AlumnoAula <----- Aula

    Si quieres saber que Aulas tiene un Alumno usaria este codigo...

    Un Ejemplo... SOY EL ALUMNO con ID=16 en el sistema...

    MiID =16
    MisAulas = db.AlumnoAulas.Where(p=>p.AlumnoId = MyID).ToList();

    Luego Aplico un FOREACH de MisAulas...

    Por cada Aula que tenga asignada
    {
             GetAula( AulaId) //Pasaria el Parametro de Id del Aula q tengo asignada... y con un metodo de Obtener el Aula obtendria la informacion que necesite para ese Aula...
    }

    Espero que te sirva... se que no tienes codigo de C# 100% pero alli tienes la solucion ;)
    solo aplica lo que sabes de C# y LINQ y listo, tendras el proyecto listo.

    Aqui tienes un Tutorial Muy bueno de LINQ, esta en espanol, puedes mirarlo a ver si te es util...
    http://thinkingindotnet.wordpress.com/tutorial-de-linq-to-sql/

    Saludos, espero que te sea util la respuesta


    Marca la Respuesta como correcta si te es util.
    MCPD - Web Developer
    MCTS - .Net Framework 2.0, Web Applications, SQL Server 2005
    jueves, 15 de abril de 2010 20:08
  • e linq no hay lio ya que lo manejo bastante bien pero el problema es como extender una clase ya creada por el EF osea ESTUDIANTE  y AULA seria el creado por el wizard de VS.NET lo que deseo  no es a nivel de diseño ya que es un ejemplo solo deseo es retornar el resultado de la consulta con linq a  la base de  datos.

     

     

    var query=from a in Contexto.ESTUDIANTE
        join b Contexto.AULA
         on a.ID_AULA equals b.ID_AULA
     .....

     

    como carga 2 tablas pues mi idea es retornar el query  pero no se como hacerlo

    osea como seria un return que debo hacer para el query..!!! y lo pueda usar como objeto en todo el sistema..!!


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    jueves, 15 de abril de 2010 20:34
  •  

    Te dare un ejemplo mas o menos de lo que creo que me estas pidiendo... :P Vamos a ver si entendi...

    Haz esto... crea una clase (en mi caso C#)...

    en esa clase vas a tener esto...

    public partial class Alumno
    {
         public List<Aula> Aulas
         {
               get
               {
                   using (TusEntities db = new TusEntities())
                   {
                         List<Int32> AulasId = db.AlumnoAulas.Where
                                                        (p=>p.AlumnoId.Equals(this.Id));
                         
                          List<Aula> listaRetorno = new List<Aula>();
         
                          AulasId.ForEach(delegate(Int32 a)
                         {
                                  listaRetorno.Add(db.Aula.Single
                                                        (p=>p.Id.Equals(a)));
                          }
                           return listaRetorno;
         }
       }
      }
    }

    Claro... Colocale su Try;Cath y validaciones por si ListaRetorno es null... podrias colocar la propiedad List<Aula> Aulas como un Nullable...

    Espero que te sirva... (Puede tener errores el codigo, ya que lo escribi aqui mismo, no lo pase por VS antes...)
    Saludos


    Marca la Respuesta como correcta si te es util.
    MCPD - Web Developer
    MCTS - .Net Framework 2.0, Web Applications, SQL Server 2005

     

    • Editado Mariojose Palma jueves, 15 de abril de 2010 20:57 No era muy visible el codigo
    jueves, 15 de abril de 2010 20:52
  • Buenas, una pregunta: ¿por qué tienes que devolver una clase que resuma tu consulta?

    Cuando trabajas con ORM (como EF) la ventaja es que puedes devoler una clase y las colecciones asociadas a estas. Por ejemplo, puedes devolver un Aula y dentro de esta aula tendrás una colección con todos los Estudiantes relacionados. Tan solo tienes que asegurar que esta habilitado el LazyLoading.

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin
    viernes, 16 de abril de 2010 19:00
  • y como puedo verificar si esta habilitado el LazyLoading y talve algun ejemplito de como hacer la carga que comentas. .:D gracias...

    ojo que estoy eon EF 1.0 gracias.. :D


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    viernes, 16 de abril de 2010 19:28
  • Facil, si estas en EF 1.0 no lo tienes. Es uno de los añadidos de EF 4. Tienes que hacer loading explicito.

    Como posible respuesta, si tienes en el modelo representada la Entidad estudiante y la Entidad Aula, con una relación many to many de estudiate a aulas puedes hacer un:

     

    return context

       .Estudiantes

       .Include<"Aulas">()

       .Where(estudiante => estudiante.Id == idparametro)

       .FirstOrDefault()

     

    Eso te devolvera el estudiante con Id idparametro (si existe, si no null), y con su propiedad Aulas traida de la base de datos. Internamente EF ejecutara mas o menos:

    SELECT TOP 1 * FROM Estudiantes

    INNER JOIN EstudiantesAulas as EA on Estudiantes.ID == EA.EstudianteID

    INNER JOIN Aulas on Aulas.ID == EA.AulaID

    WHERE Estudiantes.ID == idparametro

     

    y mapeara la información a una entidad Estudiante y n entidades Aula

     

    domingo, 18 de abril de 2010 4:55
  • millon de gracias  ahora solo resta conguir el vs.net 2010 para hacer la prueba.. :S creo que empezare a migrar lo antes posible al vs.net2010 y EF 4.0 :D gracias cuando consiga hacer la prueba les comento como me fue . .:D mientras tanto sigue abierta la pregunta.. de otras maneras de conseguir lo que deseo gracias.. :D

    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    lunes, 19 de abril de 2010 14:10