Utilisation de classes partielles dans Entity Framework avec des propriétés personnalisées

asp.net c# entity-framework

Question

Comment gérer une propriété personnalisée dans une situation où j'utilise des classes partielles avec les classes générées par EF?

Voici la configuration:

Tableau de feuille de temps - il stocke les heures d'un employé
- TimeSheetID (auto, int, PK)
- EntryDate (DateTime)
- Heures (int)
- EmployeeID (int)

Table EmployeeHourlyRate - stocke le taux horaire actuel d'un employé. Les taux historiques sont également stockés ici.
- RateID (int, PK)
- EffectiveDate (int, PK)
- Tarif (double)

Il s'agit d'une relation de un à plusieurs entre TimeSheet et EmployeeHourlyRate. Afin de trouver le taux d'un employé, je choisirais la date effective effective maximale inférieure à la date d'entrée en vigueur de la feuille de temps.

Afin de faciliter les choses, j'ai créé une classe partielle appelée TimeSheet et ajouté une nouvelle propriété appelée "Rate" à cette classe. Ce que je voudrais faire, c'est le peupler moi-même à partir de la même requête qui remplit ma collection de TimeSheets. Je ne connais aucun moyen simple et propre de gérer cela.

Par exemple, je pourrais le faire de cette façon:

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 théorie, cela devrait fonctionner, mais pour une raison quelconque, EF se plaint au moment de l'exécution que je réutilise une classe générée par une entité (je ne sais pas pourquoi - cela fonctionne bien si je crée ma propre classe personnalisée). Cependant, même si cela a fonctionné, je dois toujours conserver une liste de champs et continuer à mapper de mon EF vers une seule classe - la maintenance devient un problème lorsque / si j'ajoute de nouveaux champs à la table TimeSheet. Il est également ridicule de devoir retaper toute cette information.

Ma question est donc la suivante: comment les gens gèrent-ils généralement ce scénario? Existe-t-il un moyen de faire quelque chose dans le modèle de données qui soit capable de connaître efficacement ma règle de jointure (à propos de la sélection de la date d'effet correcte en fonction de ma date d'entrée) et de gérer cela?

Réponse acceptée

J'aimerais voir votre requête LINQ complète (y compris le code "SomeRate") pour voir exactement ce que vous essayez d'atteindre, mais peut-être que quelque chose comme ceci pourrait fonctionner:

AVERTISSEMENT: Code aérien.

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: Ajouter un exemple de chargement rapide pour éviter les allers-retours dans la base de données.

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow