实体框架中的计算属性

Chr*_*ens 29 .net entity-framework calculated-columns

假设我有一个具有以下属性的Employee对象:

string Name { get; }
float Hours { get; }
float Wage { get; }
Run Code Online (Sandbox Code Playgroud)

我想添加一个属性Salary,它等于Hours*Wage.在一个普通的业务对象中,我只是简单地在属性中编写代码,但如果需要重新生成类,这可能会消失.

是否有EF标准方法来实现这一点,而不必经历将其映射到数据库实体的麻烦?

Jos*_*dan 51

确实.创建一个单独的文件,例如EmployeeExtension.cs.

在此文件中,放置以下代码:

public partial class Employee
{
    public decimal Salary
    {
        get { return Hours * Wage; }
    }
}
Run Code Online (Sandbox Code Playgroud)

LINQ to SQL和Entity Framework类是使用partial关键字生成的,允许您将定义拆分为多个文件,因为设计人员知道您需要通过不断自动生成基本源文件来向类中添加未被覆盖的成员.

  • 这也不适用于OData(WCF数据服务).那是因为它不在edmx中.(只读取OData的EDMX.) (5认同)
  • 进入本地环境(aka .ToList())后,该属性将起作用.但是有明显的缺点.您无法使用此字段进行有效过滤,因为它要求您在执行此类操作之前请求整个数据.在巨大的数据库场景中,这可能非常昂贵且不可接受. (2认同)

小智 7

如果我没记错的话,EF创建的类是部分的.因此,您可以添加另一个包含另一个部分类(相同的命名空间,当然是相同的类名)的文件,而不是实现该属性

public single Salary
{
   get
   {
       return this.Hours * this.Wage;
   }
}
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩(如果那些单打不可空,请注意!)


Phi*_*.ie 6

我最初无法得到'Argo'的工作答案.经过一段时间的游戏,我注意到如果我装饰了属性(如在WCF中),以下属性,一切正常.

[global::System.Runtime.Serialization.DataMemberAttribute()]
Run Code Online (Sandbox Code Playgroud)

按照'Argo的说明创建一个单独的文件,(例如EmployeeExtension.cs).如上所述,这应该标记为部分.

在此文件中,放置以下代码:

public partial class Employee 
{
   [global::System.Runtime.Serialization.DataMemberAttribute()]       
   public decimal Salary     
   { 
      get { return Hours*Wage; } 
   } 
}  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助….


Mar*_*age 5

您可以在实体类中实现该属性.实体框架将生成部分类,允许您将成员添加到类中.在您的代码中添加这样的类:

public partial class Employee {
  public Single Salary {
    get { return Hours*Wage; }
  }
}
Run Code Online (Sandbox Code Playgroud)