사용자 지정 속성이있는 Entity Framework에서 부분 클래스 사용

asp.net c# entity-framework

문제

EF 생성 클래스에서 부분 클래스를 사용하는 상황에서 사용자 정의 속성을 어떻게 처리해야합니까?

다음은 설정입니다.

TimeSheet 테이블 - 직원의 근무 시간을 저장합니다.
- TimeSheetID (자동, int, PK)
- EntryDate (날짜 시간)
- 시간 (int)
- EmployeeID (int)

EmployeeHourlyRate 테이블 - 직원의 현재 시간당 요금을 저장합니다. 과거 환율도 여기에 저장됩니다.
- RateID (int, PK)
- EffectiveDate (int, PK)
- 요금 (더블)

이것은 TimeSheet에서 EmployeeHourlyRate 로의 일대 다 관계입니다. Employee 's rate를 찾으려면 timeSheet의 EntryDate보다 작은 max effectiveDate를 선택해야합니다.

일을 용이하게하기 위해 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 테이블에 새 필드를 추가하면 유지 관리가 문제가됩니다. 또한 모든 정보를 다시 입력해야하는 것은 어리석은 일입니다.

그래서 제 질문은 사람들이이 시나리오를 어떻게 다룰 수 있는가하는 것입니다. 내 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