2009-07-15 5 views
28

Предположим, что у меня есть объект Employee со следующими свойствами:Рассчитанные свойства в Entity Framework

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 к SQL и Entity Framework классов создаются с частичного ключевым словом, чтобы позволить вам разделить определение над многими файлами, потому что дизайнеры знали что вы захотите добавить членов в класс, которые не будут перезаписаны путем непрерывного автогенерирования базового исходного файла.

+0

Отлично! Я создавал теневые классы, что было крайне болезненно. Большое спасибо –

+1

Это не работает с Linq to Entities, поскольку оно не определено в реальной модели данных. Есть ли способ определить вычисленное поле в * .edmx? – AaronLS

+0

Можете ли вы быть более конкретным, чем «кажется, не работает»? Если вы ссылаетесь на столбцы с вычисленными значениями на уровне базы данных, это совершенно другой зверь. – JoshJordan

7

Если я правильно помню, классы, созданные EF, являются частичными. Таким образом, вы могли бы добавить еще один файл, содержащий другой частичный класс (то же пространство имен, то же Classname конечно), который, чем реализует свойство

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

Если сделать трюк (если эти синглы не обнуляемым, заметьте!)

5

Вы можете реализовать свойство в классе сущности. Структура сущности будет генерировать частичные классы, позволяющие добавлять членов в класс. Добавьте свой код к этому коду:

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

Я не смог получить ответ «Арго» для работы на начальном этапе. Немного поиграв, я заметил, что если бы я украсил свойство (как в WCF), то в следующем атрибуте все работало нормально.

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

Согласно инструкциям Арго, создайте отдельный файл (например, 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

Смежные вопросы