【问题标题】:Using partial-classes in Entity Framework with custom properties在具有自定义属性的实体框架中使用部分类
【发布时间】:2009-05-11 22:38:34
【问题描述】:

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

设置如下:

TimeSheet 表 - 存储员工的工作时间
- TimeSheetID(自动、整数、PK)
- EntryDate (日期时间)
- 小时(整数)
- 员工 ID(整数)

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 表时,维护会成为一个问题。必须重新输入所有这些信息也很愚蠢。

所以我的问题是,人们通常如何处理这种情况?有没有办法在数据模型中做一些事情,能够有效地了解我的加入规则(关于根据我的 EntryDate 选择正确的生效日期)并处理这个?

【问题讨论】:

  • 用你提供的小sn-p代码有点难以分辨。也许你的部分课程的其余部分......

标签: c# asp.net entity-framework


【解决方案1】:

我想查看您的完整 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;

【讨论】:

  • 这可以工作,而且非常好,如果不是因为它会导致额外的数据库命中。该对象将用于 gridview 场景...如果网格有 50 条记录,则这些记录中的每一条都将查询数据库并会导致一些很大的延迟。
  • 根据您希望数据库执行的方式,您可以“急切加载”相关实体(例如,请参阅我编辑的答案),或者您可以使用 .Load 的组合“延迟加载”实体() & .IsLoaded() ...只有您知道最好的方法是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多