none
Crear relacion uno a uno con diferentes campos. RRS feed

  • Pregunta

  • Bien, estoy retomando el uso de Code First Entity Framework (POCO) como le quieran llamar.

    el problema que estoy enfrentando es crear una relacionar uno a uno, pero!!!!!.... el problema son los nombres de las propiedades, me explico....

    tengo dos clases, la Primera: BonoSemanal, cuya propiedad ID es primary key.

        public class BonoSemanal : BindableObject
        {
            public int ID { get; set; }
            public int Semana { get; set; }
            public int Periodo { get; set; }
            public int LineaProduccionID { get; set; }
            public int BadgeNumber { get; set; }
            public decimal Lunes { get; set; }
            public decimal Martes { get; set; }
            public decimal Miercoles { get; set; }
            public decimal Jueves { get; set; }
            public decimal Viernes { get; set; }
            public decimal Sabado { get; set; }
            public decimal Domingo { get; set; }
            public decimal Extra { get; set; }
            public decimal Total
            {
                get
                {
                    return Lunes + Martes + Miercoles + Jueves + Viernes + Sabado + Domingo;
                }
            }
            public DateTime FechaCaptura { get; set; }
    
            public virtual Empleado Empleado { get; set; }
            public virtual LineaProduccion LineaProduccion { get; set; }
        }
    

    hay dos propiedades de navegacion: Empleado, LineaProduccion, el problema es con "Empleado", porque como podran notar en la clase BonoSemanal no existe ninguna propiedad llamada "EmpleadoID" por ende no jala la informacion del empleado en esta propiedad de Navegación.

    y ademas la clase Empleado:

        public class Empleado : BindableObject
        {
            public int ID { get; set; }
            public int BadgeNumber { get; set; }
            public string NombreCompleto { get; set; }
            public DateTime FechaIngreso { get; set; }
            public int HorarioID { get; set; }
            public decimal SalarioMensual { get; set; }
            public decimal SalarioDiario
            {
                get
                {
                    return SalarioMensual / 30;
                }
            }
            public decimal SalarioXHora
            {
                get
                {
                    return SalarioDiario / 8;
                }
            }
    
            public override string ToString()
            {
                return NombreCompleto;
            }
        }
    

    en esta clase existe la propiedad "BadgeNumber"  la cual es la que tiene que usarse para relacionar con la clase "BonoSemanal" para que pueda jalar la información del empleado.

    bien!!!... de esta manera al ejecutar el programa me muestra el siguiente error: "Invalid column name 'Empleado_ID'." logico!!!!... ya que no existe en la clase "BonoSemanal" la propiedad "EmpleadoID" para relacionar con la propiedad de Navegación.

    he estado intentato en la clase DbContext cambiar en el metodo OnModelCreating cambiar esta logica y que utilize la propiedad "BadgeNumber" para crear la relación con la clase "Empleado" para que pueda jalar la información del empleado, pero todas las pruebas han sido sin exito, ademas de que genera otros errores según las pruebas que he hecho para resolver este problema.

    ¿Alguien sabe como lograr esta relación?.

    Solución temporal:

    lo que he hecho para resolver el problema "temporalmente" fue cambiar los nombres de estas propiedades en las clases para lograr la relacion.

    ejemplo:

    public class BonoSemanal
    {
        public int EmpleadoID {get;set;}
    }
    
    public class Empleado
    {
        public int IntID {get;set;}
        public int ID {get;set;}
    }

    y la clase DbContext:

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //base.OnModelCreating(modelBuilder);
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                modelBuilder.Entity<DE.Empleado>().ToTable("Empleados");
                modelBuilder.Entity<DE.Empleado>().Property(p => p.IntID).HasColumnName("ID");
                modelBuilder.Entity<DE.Empleado>().Property(p => p.ID).HasColumnName("BadgeNumber");
                modelBuilder.Entity<DE.BonoSemanal>().ToTable("BonosSemanales");
                modelBuilder.Entity<DE.BonoSemanal>().Property(p => p.EmpleadoID).HasColumnName("BadgeNumber");
                modelBuilder.Entity<DE.LineaProduccion>().ToTable("LineasProduccion");
            }
    

    con esto funciona.... pero no quiero que funcione de esta manera ya que esto esta relacionado con un sistema de RRHH y necesito que las clases en el sistema de planilla tenga los nombres de las propiedad con en las tablas para evitar problemas de lectura en un futuro.

    espero haber sido claro, ya que intento reconciliarme con Entity Framework ya que por esto y otras problemas siempre termino abortando el uso de este.

    en espera de sus sugerencias.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 5 de junio de 2012 17:16

Respuestas

  • bueno, ya encontre la solución, lo que hice fue excluir la propiedad "ID" del mapeo en la clase "Empleado" y definir "BadgeNumber" como ForeingKey y crea la relación "BonoSemanal" -> "Empleado" en el DbContext y ahora funciona.

                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                modelBuilder.Entity<DE.Empleado>().ToTable("Empleados");
                modelBuilder.Entity<DE.Empleado>().Ignore(ignore => ignore.ID);
                modelBuilder.Entity<DE.Empleado>().HasKey(key => key.BadgeNumber);
                modelBuilder.Entity<DE.AumentoXAntiguedad>().ToTable("AumentosXAntiguedad");
                modelBuilder.Entity<DE.BonoSemanal>().ToTable("BonosSemanales");
                modelBuilder.Entity<DE.BonoSemanal>().HasRequired(r => r.Empleado).WithMany().HasForeignKey(f => f.BadgeNumber);
                modelBuilder.Entity<DE.LineaProduccion>().ToTable("LineasProduccion");
    

    pero, primero lo probe con "DataAnnotations" para luego materializarlo en el DbContext.

    ya estaba por abortarlo de nuevo. ;-)

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 5 de junio de 2012 19:09