2009-07-15 9 views
28

Załóżmy, że mam obiektu pracownika z następujących właściwości:Obliczone właściwości w Entity Framework

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

chcę dodać właściwość, wynagrodzenia, co równa godzin * płac. W zwykłym obiekcie biznesowym po prostu zakodowałem to w nieruchomości, ale prawdopodobnie zostałoby to zlikwidowane, gdyby klasa musiała zostać zregenerowana.

Czy istnieje sposób na wdrożenie standardu EF bez konieczności mapowania go do jednostki bazy danych?

Odpowiedz

50

Rzeczywiście. Utwórz osobny plik, na przykład EmployeeExtension.cs.

W tym pliku, należy umieścić następujący kod:

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

LINQ do klasy SQL i Entity Framework są generowane z częściowego słów kluczowych, co pozwala podzielić definicję nad wieloma plikami, ponieważ projektanci wiedzieli że będziesz chciał dodać członków do klasy, które nie zostaną nadpisane przez ciągłe autogenerowanie podstawowego pliku źródłowego.

+0

Doskonale! Tworzyłem zajęcia z cienia, co było absolutnie bolesne. Wielkie dzięki –

+1

Nie wydaje się, aby to działało z Linq na Entities, ponieważ nie jest zdefiniowane w rzeczywistym modelu danych. Czy istnieje sposób definiowania pola obliczeniowego w pliku * .edmx? – AaronLS

+0

Czy możesz być bardziej konkretny niż "nie wydaje się działać"? Jeśli odnosisz się do kolumn z wyliczonymi wartościami na poziomie bazy danych, to jest to zupełnie inna bestia. – JoshJordan

7

Jeśli dobrze pamiętam, klasy utworzone przez EF są częściowe. Więc można ewentualnie dodać kolejny plik zawierający kolejny częściowej klasy (tej samej przestrzeni nazw, tak samo classname oczywiście), które nie implementuje właściwość

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

powinno załatwić sprawę (jeśli te single nie są pustych, pamiętajcie!)

5

Możesz zaimplementować właściwość w klasie encji. Struktura encji wygeneruje częściowe klasy umożliwiające dodawanie członków do klasy. Dodaj taką klasę do swojego kodu:

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

Nie byłem w stanie uzyskać "odpowiedzi Argo na prace początkowo. Po krótkiej zabawie zauważyłem, że jeśli udekorowałem obiekt (jak w WCF), który ma następujący atrybut, wszystko działało dobrze.

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

Jak na „instrukcje Argo jest utworzenie osobnego pliku (na przykład EmployeeExtension.cs). powinno to być oznaczone jako częściowe, jak opisano.

W tym pliku, należy umieścić następujący kod:

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

Hope this helps ....

2

To nie działało dla mnie z Entity Framework 5. Rozwiązaniem było dla mnie po prostu użycie atrybutu [NotMapped]. Aby uzyskać więcej informacji, zobacz: Code First DataAnnotations