none
Herencia de clase y TPT RRS feed

  • Pregunta

  • Hola a todos

    Nuevamente buscando su ayuda por un nuevo caso que tengo; Desarrollando en C# vs2015 y EF 6.1.3 code first, tengo una clase que debe ser heredara por todas las demás clases; esta clase es para auditoria, por lo tanto todas deben tenerlo y heredan sin problema, ahora he agregado en una clase la herencia por tipo (TPT) y no se como realizar las dos herencia en una sola clase; adjunto el ejemplo

    *** Clase de auditoria para ser hererada por las demas clases
    
        public class EnAuditoria
        {
            public EnAuditoria()
            {
                AudiDateCreate = DateTime.Today;
                AudiUserCreate = EgEntornoAcceso.EgiEntAccUserId;
            }
            public int AudiUserCreate { get; set; }
            public int? AudiUserUpdate { get; set; }
            public DateTime AudiDateCreate { get; set; }
            public DateTime? AudiDateUpdate { get; set; }
        }
    
    ** clase abstracta que utilizo para el TPT
    
        public abstract class EnPersona : EnAuditoria
        {
            public int EniPersoId { get; set; }
            public string EnsPersoNombr { get; set; }
            public string EnsPersoPater { get; set; }
            public string EnsPersoMater { get; set; }
            public string EnsPersoDocum { get; set; }
            public DateTime EnfPersoNacim { get; set; }
    
            public string EnsPersoNombC {
                get { return EnsPersoPater + EnsPersoMater + EnsPersoNombr; } }
    
        }
    

    Hasta este punto todo bien, en el SQL la tabla Persona contiene los campos heredados de auditoria.

    *** Clase que se adicionar con la TPT Personal
    
        public class EnUsuario : EnPersona
        {
            public string EnsUserAlias { get; set; }
            public string EnsUserPassw { get; set; }
    
        }
    
    En este punto se ejecuto la migracion a SQL del EF, se crean las tablas peros solo la de ENPersona con Auditoria, y la tabla EnUsuario solo con sus dos campos indicados mas el PK de la tabla ENPersona; si en la clase ENUsuario deseo agregar la herencia de auditoria de la siguiente forma me indica que no puedo tener varias clases bases; como puedo solucionarlo.
    *** obtengo error al agregar EnAuditoria 
    
        public class EnUsuario : EnPersona, EnAuditoria
        {
            public string EnsUserAlias { get; set; }
            public string EnsUserPassw { get; set; }
    
        }


    Gracias por su ayuda


    Luis Ormeño

    domingo, 21 de agosto de 2016 16:38

Respuestas

  • hola

    >>si en la clase ENUsuario deseo agregar la herencia de auditoria de la siguiente forma me indica que no puedo tener varias clases bases; como puedo solucionarlo

    en c# no puedes implementar herencia multiple

    ademas la entidad EnPersona  ya hereda de EnAuditoria, por lo tanto al hacer heredar EnUsuario ya tendria estas propiedades, no necesitas volver a definir la herencia

    es mas intenta hacer

    EnUsuario u = new EnUsuario();
    
    u.AudiDateCreate  = DateTime.Now;

    vas a notar que tienes esa propeidad que define EnAuditoria

    No necesitas poner las propiedades de auditoria en EnUsuario, si bien en la db veras dos tablas en realidad la entidad es una sola, la union de las tablas  EnPersona  y EnUsuario es todo uno, cuando registras la auditoria de EnUsuario lo haces por medio de EnPersona , NUNCA vas a poder insertar en usuario sin antes tener un registro en persona

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 23 de agosto de 2016 11:11

Todas las respuestas

  • hola

    >>si en la clase ENUsuario deseo agregar la herencia de auditoria de la siguiente forma me indica que no puedo tener varias clases bases; como puedo solucionarlo

    en c# no puedes implementar herencia multiple

    ademas la entidad EnPersona  ya hereda de EnAuditoria, por lo tanto al hacer heredar EnUsuario ya tendria estas propiedades, no necesitas volver a definir la herencia

    es mas intenta hacer

    EnUsuario u = new EnUsuario();
    
    u.AudiDateCreate  = DateTime.Now;

    vas a notar que tienes esa propeidad que define EnAuditoria

    No necesitas poner las propiedades de auditoria en EnUsuario, si bien en la db veras dos tablas en realidad la entidad es una sola, la union de las tablas  EnPersona  y EnUsuario es todo uno, cuando registras la auditoria de EnUsuario lo haces por medio de EnPersona , NUNCA vas a poder insertar en usuario sin antes tener un registro en persona

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 23 de agosto de 2016 11:11
  • Gracias Leandro, lo tengo mas claro y las dudas despejadas.


    Luis Ormeño

    miércoles, 24 de agosto de 2016 18:45