2009-07-15 24 views
28

Supponiamo che io sono un oggetto Employee con le seguenti proprietà:proprietà calcolate a Entity Framework

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

voglio aggiungere una proprietà, stipendio, che è uguale a ore * salariali. In un normale oggetto di business, lo inserisco semplicemente nella proprietà, ma questo probabilmente verrebbe cancellato se la classe dovesse essere rigenerata.

Esiste un modo standard EF per implementare questo problema senza doverlo mappare a un'entità database?

risposta

50

Infatti. Creare un file separato, ad esempio, EmployeeExtension.cs.

In questo file, inserire il seguente codice:

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

classi LINQ to SQL e Entity Framework sono generati con la parziale parola chiave per consentire di dividere la definizione nel corso di molti file, perché i progettisti sapevano che vorrete aggiungere membri alla classe che non vengono sovrascritti eseguendo continuamente la generazione automatica del file sorgente di base.

+0

Eccellente! Stavo creando lezioni di ombre, il che era assolutamente doloroso. Grazie mille –

+1

Questo non sembra funzionare con Linq alle Entità poiché non è definito nel modello dati attuale. C'è un modo per definire un campo calcolato in * .edmx? – AaronLS

+0

Puoi essere più specifico di "non sembra funzionare"? Se ti riferisci a colonne con valori calcolati a livello di database, questo è un animale completamente diverso. – JoshJordan

7

Se ricordo correttamente, le classi create dall'EF sono parziali. Quindi, si potrebbe aggiungere un altro file che contiene un'altra classe parziale (stesso spazio dei nomi, lo stesso nome di classe, naturalmente), che rispetto implementa la proprietà

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

dovrebbe fare il trucco (se questi singoli non sono annullabili, sia chiaro!)

5

È possibile implementare la proprietà nella classe di entità. Il framework di entità genererà classi parziali che ti consentiranno di aggiungere membri alla classe. Aggiungere una classe come questo per il tuo codice:

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

non ero in grado di ottenere 'la risposta di Argo al lavoro inizialmente. Dopo un po 'di gioco ho notato che se avessi decorato la proprietà (come in WCF), che il seguente attributo, tutto funzionava bene.

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

Come per le istruzioni di Argo, creare un file separato (ad esempio EmployeeExtension.cs). questo dovrebbe essere contrassegnato come descritto.

In questo file, inserire il seguente codice:

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

Spero che questo aiuti ....

2

Questo non funzionava per me con Entity Framework 5. La soluzione per me era semplicemente utilizzare l'attributo [NotMapped]. Per maggiori informazioni vedi Code First DataAnnotations

Problemi correlati