在Entity Framework中使用自定義屬性的部分類

asp.net c# entity-framework

在我使用EF生成的類的部分類的情況下,我應該如何處理自定義屬性?

這是設置:

時間表 - 存儲員工的工作時間
- TimeSheetID(auto,int,PK)
- EntryDate(DateTime)
- 小時(int)
- EmployeeID(int)

EmployeeHourlyRate表 - 存儲員工當前的每小時費率。歷史匯率也存儲在這裡。
- RateID(int,PK)
- EffectiveDate(int,PK)
- 費率(雙倍)

這是從TimeSheet到EmployeeHourlyRate的一對多關係。為了找到員工的費率,我會選擇最小有效日期小於timeSheet的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;


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因