2009-07-15 13 views
28

Angenommen, ich habe ein Objekt Employee mit den folgenden Eigenschaften:Berechnete Eigenschaften in Entity Framework

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

Ich mag eine Eigenschaft hinzufügen, Gehalt, die Stunden * Lohn entspricht. In einem gewöhnlichen Geschäftsobjekt würde ich das einfach in der Eigenschaft codieren, aber dies würde vermutlich ausgelöscht werden, wenn die Klasse neu generiert werden müsste.

Gibt es eine EF-Standardmethode, um dies zu implementieren, ohne die Probleme bei der Zuordnung zu einer Datenbankeinheit zu berücksichtigen?

Antwort

50

In der Tat. Erstellen Sie eine separate Datei, z. B. EmployeeExtension.cs.

In dieser Datei den folgenden Code ein:

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

LINQ to SQL und Entity Framework-Klassen werden mit dem Teil Schlüsselwort erzeugt man die Definition über viele Dateien aufteilen zu ermöglichen, weil die Designer wussten dass Sie der Klasse Elemente hinzufügen möchten, die nicht überschrieben werden, indem Sie die Basisquelldatei kontinuierlich automatisch generieren.

+0

Ausgezeichnet! Ich hatte Schattenkurse erstellt, was äußerst schmerzhaft war. Vielen Dank –

+1

Dies scheint nicht mit Linq zu Entitäten zu funktionieren, da es nicht im tatsächlichen Datenmodell definiert ist. Gibt es eine Möglichkeit, ein berechnetes Feld in der * .edmx zu definieren? – AaronLS

+0

Können Sie genauer sein als "scheint nicht zu funktionieren"? Wenn Sie auf Spalten mit berechneten Werten auf Datenbankebene verweisen, ist das ein ganz anderes Biest. – JoshJordan

7

Wenn ich mich richtig erinnere, sind die von der EF erstellten Klassen partiell. So könnten Sie möglicherweise eine andere Datei enthält weitere Teilklasse (gleichen Namensraum, gleiche Klassenname natürlich) hinzufügen, die als die Eigenschaft implementiert

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

den Trick tun sollte (wenn diese Singles keine Nullwerte enthalten sind, wohlgemerkt!)

5

Sie können die Eigenschaft in der Entitätsklasse implementieren. Das Entitätsframework generiert Teilklassen, mit denen Sie Member zur Klasse hinzufügen können. Fügen Sie eine Klasse wie folgt zu Ihrem Code hinzu:

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

Ich war nicht in der Lage zu bekommen 'Argo's Antwort zu arbeiten, zunächst. Nach ein wenig Herumspielen bemerkte ich, dass, wenn ich die Eigenschaft (wie in WCF), die das folgende Attribut dekorierte, alles in Ordnung war.

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

Gemäß 'Argos Anweisungen erstellen Sie eine separate Datei (z. B. EmployeeExtension.cs). Dies sollte wie beschrieben partiell markiert werden.

In dieser Datei den folgenden Code ein:

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

hoffe, das hilft ....

2

Dies funktionierte nicht für mich mit Entity Framework 5. Die Lösung für mich war einfach das Attribut [NotMapped] zu verwenden. Für weitere Informationen siehe Code First DataAnnotations

Verwandte Themen