Использование частичных классов в Entity Framework с пользовательскими свойствами - PullRequest
0 голосов
/ 12 мая 2009

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

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

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

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

Это отношение один ко многим от расписания до EmployeeHourlyRate. Для того, чтобы найти ставку сотрудника, я бы выбрал максимально эффективную дату меньше, чем 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) и обрабатывать это?

1 Ответ

2 голосов
/ 12 мая 2009

Я хотел бы увидеть ваш полный запрос 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...