Uso de clases parciales en Entity Framework con propiedades personalizadas

asp.net c# entity-framework

Pregunta

¿Cómo debo manejar una propiedad personalizada en una situación en la que uso clases parciales con las clases generadas por EF?

Aquí está la configuración:

Tabla TimeSheet: almacena las horas de un empleado
- TimeSheetID (auto, int, PK)
- EntryDate (DateTime)
- Horas (int)
- EmployeeID (int)

Tabla EmployeeHourlyRate: esta almacena la tarifa por hora actual de un empleado. Las tasas históricas se almacenan aquí también.
- RateID (int, PK)
- EffectiveDate (int, PK)
- Tarifa (doble)

Esta es una relación de uno a muchos desde TimeSheet hasta EmployeeHourlyRate. Con el fin de encontrar la tarifa de un empleado, seleccionaría la fecha de vigencia máxima menos que la Fecha de entrada de la hoja de tiempo.

Para facilitar las cosas, hice una clase parcial llamada TimeSheet y agregué una nueva propiedad llamada "Rate" a esa clase. Lo que me gustaría hacer es rellenar eso desde la misma consulta que rellena mi colección de TimeSheets. Simplemente no conozco una forma fácil y limpia de manejar esto.

Por ejemplo, podría hacerlo de esta manera:

var list = from ts in Context.TimeSheets
          ....
          select new TimeSheet() {
                 TimeSheetID = ts.TimeSheetID,
                 EntryDate = ts.EntryDate,
                 Hours = ts.Hours,
                 EmployeeID = ts.EmployeeID,
                 Rate = SomeRate   //real code has been omitted 
          };

En teoría, esto debería funcionar, pero por alguna razón, el EF se queja en el tiempo de ejecución de que estoy reutilizando una clase generada por una entidad (no tengo idea de por qué, funciona bien si creo mi propia clase personalizada). Sin embargo, incluso si funcionó, todavía tengo que mantener una lista de campos y seguir asignando mi EF a una sola clase, es decir, el mantenimiento se convierte en un problema cuando agrego nuevos campos a la tabla TimeSheet. También es una tontería tener que volver a escribir toda esa información.

Entonces mi pregunta es, ¿cómo la gente generalmente maneja este escenario? ¿Hay alguna manera de hacer algo en el modelo de datos que pueda conocer de manera efectiva mi regla de unión (sobre cómo seleccionar la fecha efectiva correcta en base a mi Fecha de entrada) y manejar esto?

Respuesta aceptada

Me gustaría ver su consulta LINQ completa (incluido el código 'SomeRate') para ver exactamente lo que está tratando de lograr, pero quizás algo como esto podría funcionar:

ADVERTENCIA: Código de aire.

public partial class TimeSheet
{
    public double Rate
    {
        get //Calculate your rate here... e.g.
        {
            if ((this.Employee == null) || (this.Employee.EmployeeHourlyRates.Count == 0))
                //throw an exception

            EmployeeHourlyRate maxRate;
            foreach (EmployeeHourlyRate rate in this.Employee.EmployeeHourlyRates)
            {
                if ((rate.EffectiveDate <= this.EntryDate)
                    && ((maxRate == null) || (maxRate.EffectiveDate < rate.EffectiveDate)))
                {
                    maxRate = rate;
                }
            }

            if (maxRate == null)
                //throw exception
            else
                return maxRate.Rate;
        }
    }
}

EDITAR: Agregar ejemplo de carga impaciente para evitar viajes de ida y vuelta de la base de datos.

var list = from ts in Context.TimeSheets.Include("Employee.EmployeeHourlyRate")
           where blah blah
           select ts;


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow