在我使用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选择正确的生效日期)并处理这个问题?
答案 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;