Использование частичных классов в Entity Framework с пользовательскими свойствами

asp.net c# entity-framework

Вопрос

Как мне обработать пользовательское свойство в ситуации, когда я использую частичные классы с EF-генерируемыми классами?

Вот настройки:

Табель рабочего времени - хранит часы сотрудника
- TimeSheetID (авто, int, ПК)
- EntryDate (DateTime)
- Часы (int)
- EmployeeID (int)

Таблица EmployeeHourlyRate - хранит текущую почасовую ставку сотрудника. Исторические курсы также хранятся здесь.
- RateID (int, PK)
- EffectiveDate (int, PK)
- Оценить (двойной)

Это отношение «один ко многим» от расписания до EmployeeHourlyRate. Для того, чтобы найти ставку сотрудника, я бы выбрал max эффективное число меньше, чем EntryDate расписания.

Чтобы упростить задачу, я создал частичный класс TimeSheet и добавил в него новое свойство Rate. То, что я хотел бы сделать, это заполнить себя из того же запроса, который заполняет мою коллекцию TimeSheets. Я просто не знаю простого и чистого способа справиться с этим.

Например, я мог бы сделать это так:

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

Теоретически это должно работать, но по какой-то причине EF жалуется во время выполнения, что я повторно использую класс, сгенерированный сущностью (не знаю почему - он работает нормально, если я создаю свой собственный класс). Тем не менее, даже если это сработало, мне все равно нужно вести список полей и продолжать сопоставлять мой EF с одним классом - т. Е. Обслуживание становится проблемой, когда / если я добавляю новые поля в таблицу TimeSheet. Также глупо перепечатывать всю эту информацию.

Итак, мой вопрос: как люди обычно справляются с этим сценарием? Есть ли способ сделать что-то в datamodel, который мог бы эффективно знать мое правило соединения (о выборе правильной даты вступления в силу на основе моей EntryDate) и обрабатывать это?

Принятый ответ

Я хотел бы увидеть ваш полный запрос LINQ (включая код SomeRate), чтобы точно увидеть, чего вы пытаетесь достичь, но, возможно, что-то подобное может сработать

ВНИМАНИЕ: Воздушный кодекс.

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

РЕДАКТИРОВАТЬ: Добавление примера активной загрузки, чтобы избежать обходов базы данных.

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow