Utilizzo di classi parziali in Entity Framework con proprietà personalizzate

asp.net c# entity-framework

Domanda

Come devo gestire una proprietà personalizzata in una situazione in cui utilizzo classi parziali con le classi generate da EF?

Ecco la configurazione:

TimeSheet Table: memorizza le ore di un dipendente
- TimeSheetID (auto, int, PK)
- EntryDate (DateTime)
- Ore (int)
- EmployeeID (int)

Tabella EmployeeHourlyRate: memorizza l'attuale tariffa oraria di un dipendente. Anche le tariffe storiche sono archiviate qui.
- RateID (int, PK)
- EffectiveDate (int, PK)
- Tasso (doppio)

Questa è una relazione uno a molti da TimeSheet a EmployeeHourlyRate. Per trovare la tariffa di un dipendente, selezionerei la data massima effettiva meno della data di entrata di timeSheet.

Per facilitare le cose, ho creato una classe parziale chiamata TimeSheet e ho aggiunto una nuova proprietà chiamata "Rate" a quella classe. Quello che mi piacerebbe fare è popolarmi anch'io dalla stessa query che popola la mia collezione di TimeSheets. Non conosco un modo semplice e pulito per gestirlo.

Ad esempio, potrei farlo in questo modo:

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 
          };

Questo in teoria dovrebbe funzionare, ma per qualche motivo l'EF si lamenta in fase di esecuzione che sto riutilizzando una classe generata da entità (non so perché - funziona perfettamente se creo la mia classe personalizzata). Tuttavia, anche se ha funzionato, devo ancora mantenere un elenco di campi e continuare a mappare dal mio EF a una singola classe, ovvero la manutenzione diventa un problema quando / aggiungo nuovi campi alla tabella TimeSheet. È anche sciocco dover ridigitare tutte quelle informazioni.

Quindi la mia domanda è: in che modo le persone gestiscono generalmente questo scenario? C'è un modo per fare qualcosa nella datamodel che sarebbe in grado di conoscere efficacemente la mia regola di join (sulla selezione della data di validità corretta in base al mio EntryDate) e gestirla?

Risposta accettata

Mi piacerebbe vedere la tua query LINQ completa (incluso il codice 'SomeRate') per vedere esattamente cosa stai cercando di ottenere, ma forse qualcosa del genere potrebbe funzionare:

ATTENZIONE: codice aereo.

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;
        }
    }
}

EDIT: aggiungere un esempio di caricamento ansioso per evitare i round trip del database.

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow