Verwenden von Teilklassen in Entity Framework mit benutzerdefinierten Eigenschaften

asp.net c# entity-framework

Frage

Wie gehe ich mit einer benutzerdefinierten Eigenschaft in einer Situation um, in der ich Teilklassen mit den von EF generierten Klassen verwende?

Hier ist das Setup:

TimeSheet-Tabelle - speichert die Stunden eines Mitarbeiters
- TimeSheetID (auto, int, PK)
- EntryDate (DateTime)
- Stunden (int)
- EmployeeID (int)

EmployeeHourlyRate-Tabelle - Diese Tabelle speichert den aktuellen Stundensatz eines Mitarbeiters. Hier werden auch historische Kurse gespeichert.
- RateID (int, PK)
- EffectiveDate (int, PK)
- Rate (doppelt)

Dies ist eine Eins-zu-viele-Beziehung von TimeSheet zu EmployeeHourlyRate. Um den Tarif eines Mitarbeiters zu ermitteln, würde ich das max. Effektive Datum weniger als das EntryDate des timeSheet auswählen.

Um das zu vereinfachen, habe ich eine Teilklasse namens TimeSheet erstellt und dieser Klasse eine neue Eigenschaft namens "Rate" hinzugefügt. Was ich gerne tun würde, ist, dass ich mich aus derselben Abfrage befülle, die meine TimeSheets-Auflistung enthält. Ich kenne einfach keine einfache und saubere Art, damit umzugehen.

Zum Beispiel könnte ich es so machen:

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

Theoretisch sollte dies funktionieren, aber aus irgendeinem Grund beschwert sich die EF zur Laufzeit, dass ich eine von Entität generierte Klasse erneut verwende (keine Ahnung, warum - es funktioniert gut, wenn ich meine eigene benutzerdefinierte Klasse erstelle). Aber selbst wenn es funktioniert hat, muss ich immer noch eine Liste von Feldern pflegen und die Zuordnung von meiner EF zu einer einzelnen Klasse fortsetzen - dh, die Wartung wird problematisch, wenn / wenn ich der TimeSheet-Tabelle neue Felder hinzufüge. Es ist auch dumm, all diese Informationen erneut eingeben zu müssen.

Meine Frage lautet also: Wie gehen die Leute im Allgemeinen mit diesem Szenario um? Gibt es eine Möglichkeit, etwas im Datenmodell zu tun, das meine Join-Regel (über das Auswählen des korrekten Gültigkeitsdatums basierend auf meinem EntryDate) effektiv kennen und damit umgehen könnte?

Akzeptierte Antwort

Ich möchte Ihre vollständige LINQ-Abfrage (einschließlich des Codes "SomeRate") sehen, um genau zu sehen, was Sie erreichen möchten, aber vielleicht könnte so etwas funktionieren:

WARNUNG: Luftcode.

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

BEARBEITEN: Hinzufügen eines Beispiels für eifriges Laden, um Datenbankrundfahrten zu vermeiden.

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


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow