2009-07-15 141 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