2009-07-15 138 views
28

假设我有具有以下属性Employee对象:计算性能

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

我想补充一个属性,工资,相当于小时*工资。在一个普通的商业对象中,我只是简单地将它编码在属性中,但如果需要重新生成类,这可能会消失。

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

回答

50

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

在这个文件中,将下面的代码:

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

的LINQ to SQL和Entity Framework类与部分关键字,让您分割在多个文件中定义生成,因为设计师知道您将希望通过不断自动生成基本源文件将成员添加到不被覆盖的类。

+0

优秀!我一直在创造影子课,这是非常痛苦的。非常感谢 – 2009-07-15 21:28:36

7

如果我没记错,由EF创建的类是部分的。所以,你可能添加含有另一部分类另一个文件(同一个命名空间,当然同样的类名),这比实现属性

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

应该做的伎俩(如果这些单打是不是空的,你得注意!)

5

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

public partial class Employee { 
    public Single Salary { 
    get { return Hours*Wage; } 
    } 
} 
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; } 
    } 
} 

希望这有助于...。

2

这对Entity Framework 5来说并不适合我。对我来说,解决方案就是简单地使用[NotMapped]属性。欲了解更多信息,请参阅Code First DataAnnotations