Вычисляемые свойства в Entity Framework - PullRequest
29 голосов
/ 15 июля 2009

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

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

Я хочу добавить свойство Зарплата, равное часам * Заработная плата. В обычном бизнес-объекте я просто кодировал бы это в свойстве, но это, вероятно, было бы уничтожено, если бы класс должен был быть восстановлен.

Есть ли в EF стандартный способ реализовать это, не пытаясь сопоставить его с объектом базы данных?

Ответы [ 5 ]

51 голосов
/ 15 июля 2009

Действительно. Создайте отдельный файл, например, EmployeeExtension.cs .

В этом файле поместите следующий код:

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

LINQ to SQL и классы Entity Framework генерируются с ключевым словом частичный , чтобы позволить вам разделить определение на несколько файлов, потому что дизайнеры знали, что вы захотите добавить членов в класс, который не ' перезаписывается непрерывной автоматической генерацией исходного исходного файла.

7 голосов
/ 15 июля 2009

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

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

Нужно сделать свое дело (если эти синглы не могут быть обнуляемыми, учтите!)

6 голосов
/ 25 января 2011

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

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

В соответствии с инструкциями 'Арго создайте отдельный файл (например, EmployeeExtension.cs). это должно быть помечено как частичное, как описано.

В этом файле поместите следующий код:

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

Надеюсь, это поможет ...

5 голосов
/ 15 июля 2009

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

public partial class Employee {
  public Single Salary {
    get { return Hours*Wage; }
  }
}
2 голосов
/ 19 октября 2012

Это не сработало для меня с Entity Framework 5. Для меня было просто использовать атрибут [NotMapped]. Для получения дополнительной информации см. Code First DataAnnotations

...