none
Mantenimiento de Datos con Herencia en C#

    Question

  • Pues resulta que  tengo estas tres tablas:

    Alumnno

    Id

    Apellidos

    Nombres

    Telefono

    Docentes

    Id

    Apellidos

    Nombres

    Especialidad

    Administrativo

    Id

    Apellidos

    Nombres

    Cargo

     

    Ya habia hecho los mantenimientos o ABM de esas tablas, habia creado mis Sentencias Insert, Update, Delete las tres tablas que mencione.

    Sin embargo leyendo en foros y preguntando a personas con un poco mas experiencia que yo, coinciden en que lo que estoy haciendo es una mala praxis, y tienen razon ya que si se dan cuenta, tanto la tabla alumno, docentes y administrativo tienen datos en comun (Apellidos, Nombres, Telefono, Dni, Ubigeo), todos esos campos tienen los docentes, alumnos, y administrativo, sin embargo, alumno tiene otros datos propios como puede ser carrera, etc, igual docente tiene datos propios como especialidad, tipo_docente, si es a tiempo completo o por horas. Igual administrativo, tiene datos propios como area, cargo que ejerce.

    Y segun el concepto de Herencia en BD o Generalizacion, debe tener una tabla Padre que contenga esos datos que son comunes y heredar a sus hijos.

    Pues bien resulta que el modelo quedo de la siguiente manera:

    Usuarios: Id_Usuario , Apellidos, Nombres, DNI, Nom_Login, Pass, Direccion, Telefono

    Docentes: Id_Usuario(FK), Especialidad, Profesion, TiempoCompleto, Pago_Hora

    Alumno: Id_Usuario (FK), Carrera, Egresado(campo bit, 1 egresado 0 normal)

    Administrativo: Id_Usuario (FK), Area, Cargo, Sueldo

     

    Pues como veran el modelo queda un poco mas prolijo, la misma logica aplico al hacer mis entidades creo una clase usuario y de esta heredo las propiedades a las tres clases entidaes siguientes.

    Mi pregunta basicamente es la siguiente:

    Como realizar el ABM (Insert, Delete, Update) en este caso, nuna eh manjeado herencia desde BD y mucho menos desde C#, Basicamente necesito esto.

    Creo yo que voy a tener que crear Sentencias para el Usuario y tambien para la tabla que desee hacer mantenimiento.

    Ejemplo: SI quiero hacer mantenimiento a la tabla docente, Primero hago los cambios en tabla Usuarios y luego en la tabla hija.

    De todas maneras si alguien ah pasado por una situacion similar o algo por el estilo, y tenga algun consejo que darme de cual es la mejor manera de solucionar mi duda, les estare agradecido.

    Algun link, algun fragmento de codigo, algun articulo que quieran compartir, les estara muy agradecido

    Saludos desde Perú.

     

     



    Wednesday, June 08, 2011 3:20 PM

All replies

  • No se si entendi pero como lo tienes es como debe de estar.

    eso de crear una tabla con: id, nombre, apellido, direccion

    otra: id_tablamestra, y otros campos que no se repitan en la primera.....

    no creo que sea lo correcto, yo considero que como ya lo tienes desarrollado es como debe de quedar

    Alumnos son Alumnos, Maestros son Maestros y Administrativo son administrativos...

    asi como lo planteas para generalizar te puede Generalizar un problema despues.... así como lo definistes desde el inicio lo veo bien

    Salu2,


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Wednesday, June 08, 2011 3:39 PM
    Moderator
  • Segun lo que indicas puede ser, sin embargo, si te fijas, un alumno, administrativo y docente tienen campos en comun. y no son uno o dos, son varios.

    Apellidos, Nombres, Direccion, Telefono, Celular, Ubigeo, etc

    Wednesday, June 08, 2011 3:49 PM
  • hola

    bueno no es un tema facil de explciar poder se puede aplicar pero vas a necesitar conceptos de herencia, el tema es que aqui usar uan capa de persistencia estatica no seria muy util, porque perderias los cocneptos de herencia

    por un lado bas a necesita una clase base imagino de nombre UsuarioDAL por otra DocenteDAL o AlumnoDAL

    lo que haces es crear

    public class UsuarioDAL{

       public void GetUsuario(int id, UsuarioEntity user){

          //aqui haces la consulta y devuelve la entidad usuario cargada

       }

    }

     

    por otro lado tiene

    public class DocenteDAL : UsuarioDAL{

       public DocenteEntity GetById(int id){

          DocenteEntity doc = new DocenteEntit();

          base.GetUsuario(id, (UsuarioEntity)doc);

          //aqui haces la consulta y devuelve la entidad docuente

          //cargando el resto de los campos

       }

    }

    public class AlumnoDAL : UsuarioDAL{

       public AlumnoEntity GetById(int id){

          AlumnoEntity doc = new AlumnoEntit();

          base.GetUsuario(id, (UsuarioEntity)doc);

          //aqui haces la consulta y devuelve la entidad Alumno

          //cargando el resto de los campos

       }

    }

    para el insert y update es identico, la misma tecnica

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, June 08, 2011 3:51 PM
  • Segun lo que indicas puede ser, sin embargo, si te fijas, un alumno, administrativo y docente tienen campos en comun. y no son uno o dos, son varios.

    Apellidos, Nombres, Direccion, Telefono, Celular, Ubigeo, etc

    si, ya me fije en eso... entonces, si lo consideramos como tu lo quieres plantear, un sistema de facturacion tiene una tabla de Facturas y Detalle de facturas, como la tabla de compras y detalle de compras sera muy parecida a la tabla de facturas pero no son lo mismo asi que es mejor que esten separadas evitas problemas.

    tendras que hacer siempre filtros para ver separados los alumnos de los maestros como de lo administrativo.

    puede como plantea Leandro que en la parte de C# lo puedas generalizar, pero con respecto a la base de datos no lo considero buena practica

    yo en lo personal no lo haria como lo planteas hacer o generalizar... pero puedes hacer el experimento y sacar tus concluciones.

    Salu2,


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Wednesday, June 08, 2011 3:58 PM
    Moderator
  • pero con respecto a la base de datos no lo considero buena practica

    pero cuando modelas con un ORM aplciarias herencia en uan base de datos

    revisa este video

    Introducción ORM

    habla sobre persistencia con ORM pero de forma general alli menciona temas de herencia y como resolverlos en la base de datos

    no menciona como implementar en codigo, porque es un analisis general de persistnecia pero si da ideas de como modelar la db en estos casos y quedan muy bien

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, June 08, 2011 4:06 PM
  • Leandro no me referia a ahcer herencia en la capa de datos si no mas bien en la capa e entidades.

    Algo asi:

    UsuarioEntity

    sus propiedades (Apellidos, Nombres, Direccion, Telefono, celular, etc)

    Docentes hereda las propiedades de Usuario

    Alumno hereda las propiedades de Usuario

    Administrativo hereda las propiedades de Usuario

    A eso me referia para hacer la herencia en la capa de entidades nada mas.

     

    Desde la Capa de datos solo pasaria la entidad como parametro para el Insert o Update Respectivo.

     

    Ejm:

     

    public static void InsertDocente (DocenteEntity docente)

    {

    'La variable de tipo docente ya contiene las propiedades al heredar de usuario.

    }

    Wednesday, June 08, 2011 4:13 PM
  • me referia a ahcer herencia en la capa de datos si no mas bien en la capa e entidades.

    ahh ok pero esa parte es la mas simple, pense que apuntabas a la persistencia que es donde se complcia un poco porque tendrias una tabla Usuario y otro Docente donde en esta ultima tendrias una relacin uno a uno con la enterior

    para als entidad tal cual lo has comentado, una clase base y el resto hereda de estas, asi de simple

    pero cuando persistes el insert en la tabla usuario deberia hacerlo la DAL de usuario que incocarias desde la dal de docente

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, June 08, 2011 4:32 PM
  • Es mucha vaina hacer eso. Tu me recomiendas que mejor las separe en tablas independientes, asi se repitan campos

    es decir una tabla docentes, alumnos, administrativos sin importar que redunden campos... esa es la manera que me recomiendas?' saludos.

    Wednesday, June 08, 2011 4:52 PM
  • es justamente lo contrario deberias crear una tabla

    Usuario

    y luego una relacion uno a uno con tablas Docente, Alumnos, etc

    en la tabla usuario pones los campos comunes y en cada tabla individual los particulñares de esta entidad

    si revisas el video que propuse alli en un punto toca este tema

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, June 08, 2011 5:01 PM