实体框架中的计算属性

时间:2009-07-15 14:53:25

标签: .net entity-framework calculated-columns

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

string Name { get; }
float Hours { get; }
float Wage { get; }

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

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

5 个答案:

答案 0 :(得分:51)

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

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

public partial class Employee
{
    public decimal Salary
    {
        get { return Hours * Wage; }
    }
}

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

答案 1 :(得分:7)

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

public single Salary
{
   get
   {
       return this.Hours * this.Wage;
   }
}

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

答案 2 :(得分:6)

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

[global::System.Runtime.Serialization.DataMemberAttribute()]

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

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

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

希望这会有所帮助......

答案 3 :(得分:5)

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

public partial class Employee {
  public Single Salary {
    get { return Hours*Wage; }
  }
}

答案 4 :(得分:2)

对于我来说,实体框架5不适用。我的解决方案是简单地使用[NotMapped]属性。有关详细信息,请参阅Code First DataAnnotations