在Entity Framework中使用自定义属性的部分类

时间:2009-05-11 22:38:34

标签: c# asp.net entity-framework

在我使用EF生成的类的部分类的情况下,我应该如何处理自定义属性?

以下是设置:

TimeSheet Table - 存储员工的工作时间 - 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选择正确的生效日期)并处理这个问题?

1 个答案:

答案 0 :(得分:2)

我希望看到你的完整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;